【问题标题】:Is it possible to skip the AssemblyInitialize attribute for special tests?是否可以跳过特殊测试的 AssemblyInitialize 属性?
【发布时间】:2021-12-26 19:52:27
【问题描述】:

我有两个测试: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

【问题讨论】:

    标签: c# .net unit-testing mstest


    【解决方案1】:

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

    标有该属性的方法将在方法之前运行 标有 ClassInitializeAttribute、TestInitializeAttribute 和 TestMethodAttribute 属性。一个程序集中只能有一种方法 用这个属性装饰。

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

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

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

    我认为,有两种可能:

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

    【讨论】:

    • 看来我应该创建一个不同的解决方案
    猜你喜欢
    • 2013-06-04
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多