是否可以跳过特殊测试的 AssemblyInitialize 属性?

Is it possible to skip the AssemblyInitialize attribute for special tests?

我有两个测试:BooUnitTestBooIntegrationTest

在同一个测试项目中,我持有一个带有 AssemblyInitialize 属性装饰器的方法:

AssemblyTestsHandler.cs

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class AssemblyTestsHandler
{
    [AssemblyInitialize]
    public static async Task Bootstrap()
    {
        //Do complex stuff...
    }
}

是否可以使 Bootstrap 方法仅适用于 BooIntegrationTest 而不适用于 FooUnitTest

例如

FooTests.cs:

[TestClass]
public class FooTests
{
    [TestMethod]
    public async Task FooUnitTest()
    {
        //Skip Bootstrap()!!
    }
}

BooTests.cs

[TestClass]
public class BooTests
{    
    [TestMethod]
    public async Task BooIntegrationTest()
    {
        //Do Not Skip Bootstrap()!!
    }
}

项目结构如下:

TestingProject

-AssemblyTestsHandler.cs

-BooTests.cs

-FooTests.cs

不,你不能。 AssemblyInitialize 每个程序集将被调用一次,它将在所有其他方法 (AssemblyInitializeAttribute Class) 之前被调用:

The method marked with this attribute will be run before methods marked with the ClassInitializeAttribute, TestInitializeAttribute, and TestMethodAttribute attributes. Only one method in an assembly may be decorated with this attribute.

实际上单元测试应该以随机顺序执行:

  1. FooUnitTest1
  2. BooIntegrationTest2
  3. FooUnitTest2
  4. BooIntegrationTest1

在这种情况下,任何静态初始化都会影响所有其他单元测试。

我觉得,有两种可能:

  1. 您可以为 FooTests 使用 TestInitializeTestCleanup 属性。但这会影响性能
  2. 您可以将 ClassInitialize 用于 BooTests,但在这种情况下,您必须与单元测试分开触发集成测试。集成测试和单元测试可以通过 TestCathegory 属性来区分。