【发布时间】: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