在所有测试运行之前是否可以执行一次代码?


112

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

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

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

Answers:


153

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

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

如果您有多个单元测试程序集,那么我不知道包含一个以上程序集的任何东西。

据我所知,这与Main相当。

请注意,AssemblyInitialize-decorated方法必须位于TestClass-decorated类中,该类至少包含一个TestMethod-decorated方法,否则将不会执行!


1
我有类似的问题(仅适用于MSTest)并且工作正常。谢谢:)
奥斯卡·弗利

1
对于在MsTest和TestDriven.NET上都无法正常工作的任何其他人,可以使用静态标志来确定是否在ClassInitialize中运行代码(这在MsTest中不起作用)。
卡尔,

7
注意:仅当该方法是标有TestClass属性的类的成员时,测试引擎才会运行标有AssemblyInitialize属性的方法。
Jowen

5
@Jowen:仅当该方法是标有TestClass属性的类的成员时,测试引擎才会运行标有AssemblyInitialize属性的方法and contains methods that are marked with the TestMethod attribute
oɔɯǝɹ

3
标有AssemblyInitialize的方法将在Visual Studio 2015 Ultimate中运行,而没有其他标有TestMethod属性的方法。
克里斯(Chris)

63

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

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

12
这些属性的清理对应项是拆卸操作的清理后缀(例如ClassCleanup)
Yair Nevet

13

我在MS Test标头中看到了这一点。

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

这将在一堂课中进行测试。

听起来好像您想在所有测试之前运行某些程序。

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


除非我缺少任何内容,否则安装脚本不会帮助在测试AppDomain中运行代码。
乔治·莫尔

2
可能是我 当您说“正在测试AppDomain中运行代码”时,我不确定我是否会关注您。我认为您的问题是希望在一系列测试之前执行代码,如果这与其他情况有所不同。“安装脚本和清除脚本在测试运行之前和之后运行,无论这些测试运行中包含的测试类型如何。” msdn.microsoft.com/zh-CN/library/ms182480%28VS.80%29.aspx
Maestro1024 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.