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