Sam*_*han 35 c# unit-testing visual-studio-2008
我在一个主要是单线程,单用户的应用程序中工作.这里和那里有一些工作线程,它们只使用线程安全对象和类.单元测试实际上是测试具有多个线程的那些(为测试明确创建),并且它们测试正常.
在测试非线程安全的业务对象和子系统时,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
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更好/更优雅的方式使测试顺序进行?
flq*_*flq 19
有一个"有序测试"的概念,您可以在其中按顺序列出测试.它更适合确保某个连续的顺序,但我不知道如果B不等待A完成,那将是多么可能.
除此之外,不幸的是你的测试相互干扰.每个测试都可以使用Setup/TearDown方法,这样就可以将测试彼此隔离开来.
Col*_*itz 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();
}
Run Code Online (Sandbox Code Playgroud)
要明确这不是测试的特征,任何锁定结构都应该起作用.我在这种情况下使用系统提供的互斥锁:https://msdn.microsoft.com/en-us/library/system.threading.mutex(v = vs.110).aspx
我终于使用了有序的测试方法.它运作良好.
但是,我有一段时间让它与NAnt构建一起工作.仅在构建中运行有序测试列表需要在MSTest调用块中使用/ testmetadata和/ testlist开关.关于这些的文档是粗略的,使用类型描述.我全都谷歌搜索"MSTest/testmetadata/testlist"的例子没有效果.
然而,诀窍很简单,我觉得有必要把它还给社区,以防其他人碰到同样的问题.
然后,MSTest仅运行您创建的测试列表中列出的测试.
如果有人有更好的方法,我想听听它!
| 归档时间: |
|
| 查看次数: |
42563 次 |
| 最近记录: |