【发布时间】:2010-12-05 09:57:06
【问题描述】:
我在一个主要是单线程、单用户的应用程序中工作。 到处都有一些工作线程,它们只使用线程安全的对象和类。单元测试实际上是在测试具有多个线程(为测试显式创建)的测试,并且它们测试良好。
在测试非线程安全的业务对象和子系统时,VSTS 单元测试会失败。它们不是线程安全的也没关系,这就是应用程序使用它们的方式。
但是 MS 测试的“每个 TestMethod 一个线程”方法会害死我们。我不得不在许多单元测试类中实现对象锁,以确保测试一个接一个地运行(我并不关心顺序,但我不能让两个测试方法在同时)。
代码如下:
[TestClass]
public class TestSomeObject
{
static object turnStile = new object();
...
[TestMethod]
public void T01_TestThis()
{
lock(turnStile)
{
.. actual test code
}
}
[TestMethod]
public void T02_TestThat()
{
lock(turnStile)
{
-- actual test code
}
}
}
是否有更好/更优雅的方式让测试按顺序运行?
【问题讨论】:
-
看来您在所有测试中都在重用某个对象的实例?
-
是的,基本上。有时是数据库,有时是单例 - 在应用程序中使用
-
我终于使用了有序的测试方法。它运作良好。然而,我花了很长时间让它与 NAnt 构建一起工作。 仅在构建中运行有序测试列表需要在 MSTest 调用块中使用 /testmetadata 和 /testlist 开关。关于这些的文档是粗略的,使用一种描述。我到处搜索“MSTest /testmetadata /testlist”的例子,但没有效果。然而,诀窍很简单,我觉得有必要将它回馈给社区,以防其他人遇到同样的问题。 1.编辑测试元数据文件(扩展名为.vsmdi),a
-
既然你声称这是 unit-testing 通过你的标签,你应该模拟/存根你的依赖关系,特别是不是线程安全的依赖关系
-
所以,简短的回答是:不。没有办法做到这一点,因为单元测试彼此之间不可靠,你能负担得起改变你的测试,以便在每次测试中创建和销毁这样的实例吗?
标签: c# unit-testing visual-studio-2008