【问题标题】:Unit Tests from multiple test classes appear to be interleaved来自多个测试类的单元测试似乎是交错的
【发布时间】:2016-05-09 11:51:46
【问题描述】:

我在一个 MSTest 项目中的两个单独的类中进行了测试,每个类(我认为)设置正确并且每个类都运行良好,但是当我运行整个项目的测试时,有些测试失败了。

我的两个课程都涉及设置一些外部数据,但每个课程都旨在确保在开始之前处于已知状态(并在完成后擦除它)。虽然 MSTest 可能会并行运行测试类中的所有方法(?),但我会按顺序运行每个类......这是一个不正确的假设吗?

编辑:我遇到了这个问题 (how does MSTest determine the order in which to run test methods?) 这似乎表明 VS 可能会以(看似但实际上并非)随机顺序将来自多个类的测试交错,即它确实 不 运行所有测试在 B 类开始之前在 A 类中。这在我的情况下是有问题的,因为即使我在一个类中订购我的测试,MSTest 仍可能运行来自多个冲突的类的方法?

【问题讨论】:

  • @L-Three 我明白了吗,除非我明确要求,否则 VS 确实 不 并行运行测试?
  • 确实,默认顺序。从 VS 2010 开始,并行是可能的。另请阅读blogs.msdn.microsoft.com/vstsqualitytools/2009/12/01/…。
  • 规则:每个测试应该完全独立于任何其他测试;和执行顺序无关紧要。
  • 如果每个方法都执行完整的 setup/teardown 功能而不是在类 init/teardown 中执行,我可以这样做,这似乎有点低效。部分我只是没想到不同的类的测试会交错因为我们有类设置/拆卸功能可以影响环境

标签: c# visual-studio visual-studio-2013 mstest


【解决方案1】:

重要提示

MsTest 不保证执行顺序和运行顺序可能不同。 If you need to rely on order you'll need to created an Ordered Test,一个 VS Premium/Enterprise 功能,除非您使用 Visual Studio 2015 更新 2,它将它们带到 Pro。

测试执行可以交错、反弹和做各种疯狂的事情。尽管在某些版本的 MsTest 上,它倾向于按测试的完整命名空间的字母顺序运行,例如:my.namespace.class.method。

当使用数据驱动测试时,它甚至更奇怪,因为来自数据源的数据的顺序充当了额外的随机化器。

不要依赖顺序最好使用TestInitialize并在每个测试执行之前运行您的代码,而不是依赖[Class|Assembly]Initialize以不同测试之间不兼容的方式设置您的数据.

Visual Studio 2015 及更早版本。

MsTest can execute tests in parallel using the legacy test runner and when specifying parallelism in the testSettings file。在旧版运行器中,测试将在最多 5 个线程上执行。旧版测试运行程序不会以任何方式限制测试。如果可以并且没有特定的顺序或保护,它将并行运行所有测试。您可以在下面的屏幕截图中看到:

除非您的 testSettings 明确提及并行性,否则测试将按顺序运行,但没有特定顺序。我怀疑它会使用编译程序集的 IL 顺序或字母顺序。源文件中的顺序肯定不是用的。

在 Visual Studio 2015 更新 1 及更高版本中

Visual Studio 2015 更新 1 引入了在新的测试运行器中并行运行测试的选项。新的测试运行器使用不同的方法,并将并行化每个容器的测试。对于 C#,这意味着这意味着一个程序集中的测试按顺序执行,而单独程序集中的测试可以并行执行。

假设集成测试和 UI 测试保存在各自独立的解决方案中,并且当您启用此并行选项时,您将获得一个仅包含单元测试的解决方案。

【讨论】:

  • 谢谢。从到目前为止的 cmets 中,我意识到这不是并行问题,而是交错/顺序问题,请参阅更新的标题
  • 是的,测试项目中没有明确的顺序,除非据我所知,您的类都具有ClassInitialize 属性,在这种情况下,这两个类的测试不会交错。
  • 您是说使用ClassInitialize 的课程可以保证所有测试都不间断运行吗?因为那个旁注基本上可以解决我的问题
  • 同样在 VS2013 中我找不到查看测试 运行顺序的方法。测试资源管理器似乎没有显示它
  • 我是说我记得 ClassInitialize 将充当测试之间的边界,但是我写 MsTest 已经很长时间了,而且文档也很少。我会说试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2018-10-27
  • 1970-01-01
  • 2013-06-07
  • 2020-12-16
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多