【问题标题】:Is it possible to execute code once before all tests run?是否可以在所有测试运行之前执行一次代码?
【发布时间】:2010-03-04 20:38:39
【问题描述】:

基本上我想告诉 MSTest 在启动一系列测试运行之前执行一些代码,基本上我想做的就是在Main() 中粘贴一些代码。

我想这样做的原因是我想在集成测试运行期间使用 log4net 进行一些日志记录。我不能只使用log4net.Config.XmlConfigurator 程序集属性,因为当它在我的测试程序集中读取它时,它已经调用了LoggerManager。文档建议在代码入口点显式配置 log4net - 但在我的测试中它在哪里?

我需要能够在 TestDriven.NET 和 MSTest 运行器中运行我的测试。

【问题讨论】:

    标签: .net mstest


    【解决方案1】:

    FWIW,您可以使用AssemblyInitialize 属性在程序集中的所有单元测试执行之前运行代码:

    [TestClass]
    public class SetupAssemblyInitializer
    {
        [AssemblyInitialize]
        public static void AssemblyInit(TestContext context)
        {
            // Initalization code goes here
        }
    }
    

    如果您有多个单元测试程序集,我不知道包含多个程序集的任何内容。

    据我所知,这与 Main 等价物尽可能接近。

    注意AssemblyInitialize-decorated 方法必须TestClass-decorated 类中,该类至少包含一个TestMethod-decorated 方法,否则将强>被处决!

    【讨论】:

    • 我遇到了类似的问题(仅适用于 MSTest)并且工作正常。谢谢:)
    • 对于其他在从 MsTest 和 TestDriven.NET 获得此工作时遇到问题的人,您可以使用静态标志来确定是否在 ClassInitialize 中运行代码(这在 MsTest 中不起作用)。
    • 注意:只有当该方法是标有 TestClass 属性的类的成员时,测试引擎才会运行标有 AssemblyInitialize 属性的方法。
    • @Jowen :只有当该方法是标记有 TestClass 属性 and contains methods that are marked with the TestMethod attribute 的类的成员时,测试引擎才会运行标记有 AssemblyInitialize 属性的方法。
    • 标有 AssemblyInitialize 的方法将在 Visual Studio 2015 Ultimate 中运行,而没有其他标有 TestMethod 属性的方法。
    【解决方案2】:

    为了完成,这些是 MSTest 的“运行代码之前”选项:

    • 使用[AssemblyInitialize] 在每个程序集中运行一次代码,然后再运行该程序集中的任何测试。
    • 使用[ClassInitialize] 为每个类运行一次代码,然后在定义该方法的类中进行任何测试。
    • 使用[TestInitialize] 在定义方法的类中的每个测试之前运行代码。

    【讨论】:

    • 这些属性的清理对应物是用于拆卸操作的清理后缀(例如 ClassCleanup)
    • 请注意,[ClassInitialize] 不能随便扔进去,它必须是静态的,并且只接受一个 TestContext (source) 类型的参数。
    【解决方案3】:

    我在 MS 测试标题中看到了这一点。

    // Use ClassInitialize to run code before running the first test in the class
    //[ClassInitialize()]
    //public static void MyClassInitialize(TestContext testContext) { }
    

    这将在一个类的测试之前运行。

    听起来你想在所有测试之前运行一些东西。

    测试运行配置中还有设置脚本选项。

    【讨论】:

    • 除非我遗漏了什么,否则设置脚本对在测试 AppDomain 中运行代码没有帮助。
    • 可能是我。当您说“在测试 AppDomain 中运行代码”时,我不确定我是否会关注您。我读到你的问题是想在一系列测试之前执行代码,如果它是不同的东西的话。 “设置脚本和清理脚本在测试运行之前和之后运行,无论这些测试运行中包含的测试类型如何。” msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
    • 请注意,[ClassInitialize] 不能随便扔进去,它必须是静态的,并且只接受一个 TestContext (source) 类型的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多