为什么在同一个测试项目程序集中调用[AssemblyInitialize]和[AssemblyCleanup]两次?

Mat*_*att 9 integration-testing unit-testing mstest visual-studio-2008

我认为这些属性的全部目的是每个程序集只运行一次.我有一个简单的类如下:

[TestClass]
public class AssemblyIntegrationTestSetup
{
    public AssemblyIntegrationTestSetup() { }
    public TestContext TestContext { get; set; }

    [AssemblyInitialize]
    public static void SetupIntegrationTests(TestContext context)
    {
         WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator");
    }

    [AssemblyCleanup]
    public static void TeardownIntegrationTests()
    {
          WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator");
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行测试套件时,程序集级Initialize和Cleanup方法执行两次.以下是关于我的环境的详细信息:

  1. 所有测试类都在同一个项目/程序集中.
  2. 我有按命名空间分隔的集成和单元测试.
  3. 对于集成测试,我使用MSTextExtensions来允许回滚数据库事务.
  4. 我也开始/停止MS SQL Server DTC服务,这是回滚功能所必需的.我希望每个测试套件运行一次(我发现最好的折衷方案是使用汇编级属性).代码可以工作,但它执行两次.
  5. 如果重要的话,我在一些测试中也使用了Microsoft Moles Framework.

观察到的行为类似于:

AssemblyInitialize         

Class1.TestInitialize
Class1.TestMethod1
Class1.TestCleanup

AssemblyInitalize         <-- //This shouldn't be happening right?

Class2.TestInitialize
Class2.TestMethod1
Class2.TestCleanup

Class2.TestInitialize
Class2.TestMethod2
Class2.TestCleanup

Class5.TestInitialize
Class5.TestMethod1
Class5.TestCleanup

Class7.TestInitialize
Class7.TestMethod1
Class7.TestCleanup

//More random bouncing around then...

AssemblyCleanup 
AssemblyCleanup           <-- //This shouldn't be happening right?
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 7

来自MSDN Library文章:

重要

不应在ASP.NET单元测试上使用此属性,即使用[HostType("ASP.NET")]属性进行的任何测试.由于IIS和ASP.NET的无状态特性,每次测试运行时可能会多次调用使用此属性修饰的方法.


您可以在测试跑步者中调整很少的旋钮.我只想用一个计数器解决这个问题:

private int InitCount;

[AssemblyInitialize]
public static void SetupIntegrationTests(TestContext context)
{
     if (InitCount++ == 0) {
         WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator");
     }
}

[AssemblyCleanup]
public static void TeardownIntegrationTests()
{
      if (--InitCount == 0) {
          WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator");
      }
}
Run Code Online (Sandbox Code Playgroud)