我在一个主要是单线程,单用户的应用程序中工作.这里和那里有一些工作线程,它们只使用线程安全对象和类.单元测试实际上是测试具有多个线程的那些(为测试明确创建),并且它们测试正常.
在测试非线程安全的业务对象和子系统时,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)
是否有更好/更优雅的方式使测试顺序进行?
每个包含测试的类是否都在它自己的线程中运行?或者每个单独的测试都在它自己的线程中运行?如果每个包含测试的类都有自己的线程,它们是否同时运行?即,来自A类的测试是否会与B类测试同时进行?或者是A类的测试运行(每个都在自己的线程上),然后是B类的测试(每个都在自己的线程上)?
我有很多以这种格式编写的测试:
[TestMethod]
public void TestMethod1()
{
try
{
DoShomething();
}
catch (Exception e)
{
WriteExceptionLogWithScreenshot( e );
}
}
[TestMethod]
public void TestMethod2()
{
try
{
DoAnotherShomething();
}
catch ( Exception e )
{
WriteExceptionLogWithScreenshot( e );
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用类似的东西来统一这个异常处理
[TestCleanup]
public void Cleanup()
{
// find out if an exception was thrown and run WriteExceptionLogWithScreenshot( e )
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以避免在所有方法中编写 try catch 块。
mstest 支持这样的东西吗?有人知道我能做什么吗?