每个测试类有多个类清理属性

本文关键字:属性 测试类 | 更新日期: 2024-10-30 21:09:26

情况:我的一些集成测试类共享一种在数据库中设置场景的通用方法,因此我提供了一个抽象基类。它还会在运行所有测试后进行最后的完整数据清理:

public abstract class IntegrationTests
{
    ...
    protected static void Cleanup() { ... }
}
我的

继承类需要调用基方法,以确保我的基清理代码运行:

[TestClass]
public class FooIntegrationTests : IntegrationTests
{
    ...
    [ClassCleanup]
    public static void FooCleanup()
    {
        ...
        Cleanup();
    }
}

问题:根据 MSDN"类中的一个方法可能使用 [ClassCleanup] 属性进行修饰",因此我无法从基类修饰 Cleanup 方法,即使我这样做了,该方法也不会被调用。

问题:我想要一个解决方案

  • 始终从基类运行 Cleanup 方法,而不在继承的类中实现任何内容,并且
  • 始终从继承测试类运行自定义清理方法(如果有)。

我不喜欢强制继承测试类显式调用基类,因为我必须记住实现它。我更喜欢一种更优雅但更简单(!)的技术。有什么想法吗?

注意:为我的基本功能提供由所有测试类共享的单例不起作用,因为我在多个测试代理上并行运行测试,这些代理都连接到同一个数据库实例。

每个测试类有多个类清理属性

根据评论中的回答,调用 ClassCleanup 不再发挥作用。

我在工作中一直这样做。您所要做的就是将基类也固定为测试类,并在那里"花费"清理和拆卸属性。如果你需要在派生类中进行清理/拆卸,只需创建一个虚拟方法,你可以在需要时进行ovveride:

[TestClass]
public abstract class BaseIntegrationTest
{
    [TestInitialize]
    public void BeforeEach() {
        // Stuff that should happen before each unit test
        BaseTestInitialize();
    }
    [TestCleanup]
    public void AfterEach(){
        // Stuff that should happen after each unit test
        BaseTestCleanup();
    }
    public virtual void BaseTestInitialize() { }
    public virtual void BaseTestCleanup() { }
}

使用此构造,您在集成测试中所要做的就是覆盖 BaseTestCleanup():

[TestClass]
public class DerivedTestClass : BaseIngetrationTest
{
    public override void BaseTestCleanup()
    {
        // Derived cleanup
        base.BaseTestCleanup();
    }

    [TestMethod]
    public void SomeMethod_SomeCriteria_SomeResult()
    {
        // Arrange
        // Act
        // Assert
    }
}