MSTest同时执行我的所有测试会中断测试 - 该怎么做

时间:2009-03-31 04:54:50

标签: configuration mstest

好的,这很烦人。

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

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

有人能想到一个快速解决这个问题的方法吗?我不想抛弃MSTest(好吧,我只是做另一个故事),我确定他不想运行一个完整的数据库服务,所以我会采取任何方式强迫MSTest不要同时运行或欺骗打开文件。

有人有什么想法吗?

3 个答案:

答案 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默认情况下并行执行测试,但是在单个线程中按顺序执行它们。 (然而,可以打开并行执行。但这不会完全阻止问题)

我觉得非常令人不安的是,顺序执行将以任意顺序进行,甚至跨越测试类!

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

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

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

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

答案 2 :(得分:2)