【问题标题】:How can I isolate unit tests by class?如何按类隔离单元测试?
【发布时间】:2014-07-25 12:41:58
【问题描述】:

我在访问共享资源的几个类中有许多“单元测试”(它们实际上是集成测试),并且我希望每个测试类只获取一次资源(出于性能原因)。

但是,当我在 [ClassCleanup] 中释放资源时,我遇到了问题,因为在完成所有测试之前它不会运行。

这是一个简化的例子:

using Microsoft.VisualStudio.TestTools.UnitTesting;

static class State
{
    public static string Thing;
}
[TestClass]
public class ClassA
{
    [ClassInitialize]
    public static void Initialize(TestContext ctx)
    {
        State.Thing = "Hello, World!";
    }
    [ClassCleanup]
    public static void Cleanup()
    {
        State.Thing = null;
    }
    [TestMethod]
    public void TestA()
    {
        Assert.IsNotNull(State.Thing); // Verify we have a good state
    }
}
[TestClass]
public class ClassB
{
    [TestMethod]
    public void TestB()
    {
        Assert.IsNull(State.Thing); // Verify we have an uninitialized state
        // Initialize state, do stuff with it
    }
}

至少在我的机器上,TestB 失败了,因为它在 ClassA 被清理之前运行。

我读过ClassCleanup May Run Later Than You Think,但这并不能解释任何改变行为的方法。而且我意识到我不应该依赖测试排序,但是为每个测试重新获取资源太昂贵了,所以我想按类对它们进行分组。

我该如何解决这个问题?有没有办法强制每个测试类作为一个单元运行,并立即进行清理?

【问题讨论】:

  • 在 TestB 中进行调用,然后它将单独工作
  • @AmitAgrawal “打电话”是什么意思?
  • 单元测试可以以任何顺序运行。我可以建议在每个测试类中制作资源的本地副本。这样至少类在某种程度上是独立的。
  • @AD.Net 不幸的是,资源不是可以复制的类型。只有实例可用(至少在当前实现的情况下)。
  • 而且ClassA和ClassB的初始化不一样?

标签: c# visual-studio unit-testing integration-testing mstest


【解决方案1】:

虽然ClassCleanup 的运行时间可能不可靠,但ClassInitialize 不可靠;为什么不给依赖这个共享资源的每个测试类一个ClassInitialize 来清理前一个测试类的共享资源(如果有的话),就在获取资源本身之前?

共享资源唯一没有被释放的时间是最后一个测试类,但是你可以使用ClassCleanup 处理它,因为它在运行时不再重要(因为不会有任何后面有更多的测试类)。

【讨论】:

  • 我发现我的一些测试实际上是在其他类的测试之间运行的。我不得不做一些史诗般的体操来获得一个临时解决方案。您对如何按班级分组运行测试有任何想法吗?我能想到的最好的事情是有序测试,或者可能创建一个新项目。
  • @KendallFrey 老实说,我没有想到它会混合来自不同测试类的测试。如果真的没有办法在测试类之间共享该资源,那么有序测试可能是您最好的选择(我认为没有部分有序测试之类的东西)
【解决方案2】:

是否有任何理由不能让整个程序集一次性共享此资源?使其成为其中一个测试类(或单独的指定类)中的内部或公共静态变量,并直接从所有测试类中引用它。资源的初始化将在 [AssemblyInitialize] 方法中进行,而清理将在 [AssemblyCleanup] 中进行。

【讨论】:

  • 不幸的是,不同类的测试需要不同的配置等,因此无法共享。我最终的解决方案是将测试拆分为可以共享它的单独程序集,尽管它确实产生了一些大部分毫无意义的测试项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多