我在一个主要是单线程,单用户的应用程序中工作。 这里和那里有一些工作线程,它们只使用线程安全对象和类。单元测试实际上是测试那些具有多个线程的(为测试明确创建),并且它们测试正常。
在测试非线程安全的业务对象和子系统时,VSTS单元测试失败。他们没有线程安全,这就是应用程序使用它们的方式。
但是,每个TestMethod的“一个线程”的MS测试方法会让我们失望。我必须在许多单元测试类中实现对象锁,只是为了确保测试一个接一个地运行(我真的不关心顺序,但是我不能让两个测试方法在同一个对象上运行同时)。
代码如下所示:
[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
}
}
}
是否有更好/更优雅的方式让测试依次运行?
答案 0 :(得分:26)
答案 1 :(得分:19)
有一种“有序测试”的概念,您可以在其中按顺序列出测试。它更倾向于确保某个连续的顺序,但是我不知道如果B不等待A完成,那将是多么可能。
除此之外,不幸的是你的测试相互干扰。每个测试都可以使用Setup / TearDown方法,这样就可以将测试彼此隔离开来。
答案 2 :(得分:18)
您可以使用播放列表
右键点击测试方法 - >添加到播放列表 - >新播放列表
然后您可以指定执行顺序
答案 3 :(得分:13)
对于每个测试执行,您可以特别要求使用互斥锁,无论是在要序列化的特定测试中,还是在类中的所有测试中(无论共享相同的互斥锁字符串)。
对于整个测试类,您可以使用TestInitialize和TestCleanup属性,如下所示:
private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString");
[TestInitialize]
public void Initialize()
{
testMutex.WaitOne(TimeSpan.FromSeconds(1));
}
[TestCleanup]
public void Cleanup() {
testMutex.ReleaseMutex();
}
要明确这不是测试的特征,任何锁定结构都应该起作用。我在这种情况下使用系统提供的互斥锁: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx
答案 4 :(得分:8)
我终于使用了有序的测试方法。效果很好。
然而,我有一段时间让它与NAnt构建一起工作。 在构建中仅运行 订购的测试列表需要在MSTest调用块中使用/ testmetadata和/ testlist开关。 关于这些的文档是粗略的,使用类型描述。我全都谷歌搜索“MSTest / testmetadata / testlist”的例子没有效果。
然而,诀窍很简单,我觉得有必要把它还给社区,以防其他人遇到同样的问题。
然后,MSTest仅运行您创建的测试列表中列出的测试。
如果有人有更好的方法,我想听听它!
答案 5 :(得分:2)
我使用了有序测试,也只是使用命令
在jenkins上轻松配置它们MSTest /testcontainer:" orderedtestfilename.orderedtest" / resultsfile:" testresults.trx"