【问题标题】:MSTest executing all my tests simultaneously breaks tests - what to doMSTest 同时执行我的所有测试会中断测试 - 该怎么办
【发布时间】:2009-03-31 04:54:49
【问题描述】:

好吧,这很烦人。

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

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

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

有人有什么想法吗?

【问题讨论】:

    标签: configuration mstest


    【解决方案1】:

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

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

    【讨论】:

    • “意外异常”是什么意思?我尝试抛出 .NET 和本机 (C++) 异常,而 TestCleanup() 似乎总是被调用。
    • 如果不检查,我认为可能会出现异常(比如堆栈溢出),导致线程退出而无法运行清理代码。在那种情况下,监视器永远不会退出。
    • 在 .Net 2.0 或最新版本上,StackOverflowException 将使 mstest.exe 进程崩溃。 IOW 整个事情将简单地关闭并从正在运行的进程列表中消失。在这种情况下,是否释放监视器是一个有争议的问题。
    • 对于后代:请参阅@user3202543 的回答,他提出了一个很好的观点。
    • 让我们明确一点,这是用于单元测试的。应该修复失败的测试,所以当不调用测试清理时,我可以接受它的失败。不过,这可能是持续集成的一个问题。最好在办理登机手续之前确保一切顺利。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 七 - 我认为我的一位同事说得最好:这是因为 MSTest 不是单元测试框架。这是一个非常通用的测试框架,它试图为太多的人做太多的事情,但都失败了。
    • Jep,也许这只是 M$ 总是驱动的多合一的解决方案范式,导致万物无所不能,但一无所用。所以,可能我们确实需要切换到 NUnit,因为我的一些同事不使用 resharper。
    • “试图为太多人做太多事情,但都失败了。”适用于整个微软,而不仅仅是他们的单元测试“框架”
    • 虽然我同意你的观点,mstest.exe 搞乱了顺序,但作为测试作者,你不应该依赖于测试运行的顺序。每个测试都应该独立于任何其他测试运行,这是生成有效测试用例的唯一方法。
    【解决方案3】:

    【讨论】:

    • 抱歉,不回答问题。
    • 确实如此,Ordered 测试按顺序运行所有测试,这正是您想要的!
    • 确实如此,但您必须解释原因。否则,您并没有真正回答问题,而只是提出建议
    • 确实,有序测试是必经之路。
    • 再次,它没有回答问题。我正在运行 VS2015,并且测试不按 Alphabetical.orderedtest 文件中的条目顺序运行。我有几个测试类,并且仅对给定类中的测试遵守顺序。
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多