24

好吧,这很烦人。

MSTest 同时执行我的所有测试,这导致其中一些测试失败。不,这不是因为我的测试很脆弱并且容易受到构建顺序的影响,而是因为这是一个演示项目,我在其中使用从文件运行的 Db4o 对象数据库。

所以我有几个 DataAccess 测试检查我的存储库是否正常工作并且繁荣,MSTest 爆炸了。由于它尝试同时运行所有测试,因此当测试尝试访问数据库文件而其他测试正在使用它时会出错。

谁能想到一个快速的方法来解决这个问题?我不想放弃 MSTest(好吧,我愿意,但这是另一个故事),而且我肯定不想运行一个成熟的数据库服务,所以我会采取任何方式强制 MSTest 不要同时运行或与打开文件。

有人有想法么?

4

3 回答 3

34

您可能想尝试使用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);
}

这应该强制您的所有测试连续运行,并且只要您的所有测试通过/失败,它们就应该运行。但是,如果它们中的任何一个引发意外异常,那么所有其余的都将挂起,因为退出代码不会为爆炸的测试运行。

于 2009-03-31T05:19:41.460 回答
5

我尝试过以这种方式使用锁。然而,我所经历的是,VS2010默认情况下不会并行执行测试,而是在单个线程中按顺序执行它们。(但是可以打开并行执行。但这并不能完全防止问题发生)

我发现非常令人不安的是,顺序执行将以任意顺序发生,甚至跨测试类!

例如,执行顺序可能如下所示:

  • A 类 - TestInitialize:将建立锁定
  • A 类 - TestMethod1:将执行,OK
  • B类-TestInitialize:将建立锁定=>线程将被阻止=>完整的单元测试将被阻止!原因是没有其他线程可以继续执行 A 类的方法。因此永远不会到达 Montor.Exit()。

我不明白为什么 MS 会这样做。其他 UnitTest 框架(例如 JUnit)按类执行测试方法。否则会有一些 SetUp/TearDown 方法的交错,这会导致描述的混乱......

有没有人知道如何防止 MSTest 在测试类之间跳转?(目前我使用 Resharpers 测试运行器,它的行为符合预期,在继续下一个类之前执行一个类的所有测试方法)

于 2010-05-17T13:28:35.753 回答
3

使用有序测试

http://msdn.microsoft.com/en-us/library/ms182630(v=VS.90).aspx

于 2011-11-01T21:19:23.897 回答