好的,这很烦人。
MSTest同时执行我的所有测试,导致其中一些测试失败。不,这不是因为我的测试很脆弱且容易构建顺序,而是因为这是一个演示项目,我在其中使用从文件运行的Db4o对象数据库。
所以我有几个DataAccess测试检查我的存储库是否正常工作并且繁荣,MSTest爆炸了。由于它试图同时运行所有测试,当测试试图访问数据库文件而其他测试正在使用它时会出现错误。
有人能想到一个快速解决这个问题的方法吗?我不想抛弃MSTest(好吧,我只是做另一个故事),我确定他不想运行一个完整的数据库服务,所以我会采取任何方式强迫MSTest不要同时运行或欺骗打开文件。
有人有什么想法吗?
答案 0 :(得分:33)
您可能想尝试使用Monitor并输入TestInitialize并退出TestCleanup。如果您的测试类都依赖于外部文件,则需要为所有测试类使用单个锁定对象。
public static class LockClass
{
public static object LockObject = new object();
}
...
[TestInitialize]
public void TestSetup()
{
Monitor.Enter(LockClass.LockObject);
}
[TestCleanup]
public void TestCleanup()
{
Monitor.Exit(LockClass.LockObject);
}
这应该强制所有测试按顺序运行,只要所有测试都通过/失败,它们就应该运行。但是,如果它们中的任何一个抛出了意外的异常,那么所有其余的都会挂起,因为退出代码不会为爆炸的测试运行。
答案 1 :(得分:5)
我尝试过以这种方式使用锁。 然而,我所经历的是,VS2010默认情况下不并行执行测试,但是在单个线程中按顺序执行它们。 (然而,可以打开并行执行。但这不会完全阻止问题)
我觉得非常令人不安的是,顺序执行将以任意顺序进行,甚至跨越测试类!
例如,执行顺序可能如下所示:
我不明白为什么MS会这样做。其他UnitTest框架(例如JUnit)按类别执行测试方法。否则将会有一些SetUp / TearDown方法的交错,这将导致描述混乱......
有没有人知道如何防止MSTest在测试类之间跳跃? (目前我使用Resharpers测试运行器,其行为符合预期,在继续下一个类之前执行一个classe的所有测试方法)
答案 2 :(得分:2)