当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《MSTest同时执行我的所有测试会中断测试-该怎么做》经验,为你挑选了2个好方法。

好的,这很烦人.

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

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

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

有人有主意吗?



1> tvanfosson..:

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

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



2> Seven..:

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

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

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

A类 - TestInitialize:将建立锁定

A类 - TestMethod1:执行,好的

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

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

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


七 - 我认为我的一位同事说得最好:这是因为MSTest不是一个单元测试框架.这是一个非常通用的测试框架,它试图为太多人做太多事情并且在所有这些框架中失败.
虽然我同意你的观点,mstest.exe会破坏订单,但作为测试作者,你不应该依赖测试运行的顺序.每个测试都应该独立于任何其他测试运行,这是您生成有效测试用例的唯一方法.
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有