代码之家  ›  专栏  ›  技术社区  ›  George Mauer

MSTEST同时执行所有测试会中断测试-要做什么

  •  23
  • George Mauer  · 技术社区  · 16 年前

    好吧,这很烦人。

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

    所以我做了一些数据访问测试,检查我的存储库是否正常工作,MSTEST爆炸了。因为它尝试同时运行所有测试,所以当测试尝试在其他测试使用数据库文件时访问该文件时,它会出错。

    有人能想出一个快速解决这个问题的方法吗?我不想放弃MSTEST(好吧,不过是另一个故事),而且我确定我不想运行一个完整的数据库服务,所以我会采取任何方法强制MSTEST不要同时运行,也不要在打开文件时耍花招。

    有人有什么想法吗?

    3 回复  |  直到 7 年前
        1
  •  33
  •   tvanfosson    16 年前

    您可能想尝试使用 Monitor 进入测试初始化并退出测试清理。如果您的测试类都依赖于外部文件,那么您需要为所有这些类使用一个锁对象。

    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);
    }
    

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

        2
  •  5
  •   MarkP    7 年前

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

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

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

    • A级-测试:将建立锁
    • 类A-testmethod1:将执行,确定
    • B类-测试:将建立锁 =>线程将被阻止 =>完成单元测试将被阻止!原因是没有其他线程可以继续执行类A的方法。因此永远无法到达montor.exit()。

    我不明白微软为什么这么做。其他UnitTest框架(例如JUnit)按类方式执行测试方法。否则会出现一些设置/拆卸方法交错,导致描述的混乱…

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