来自多个测试类的单元测试似乎是交错的

时间:2016-05-09 11:51:46

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

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

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

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

1 个答案:

答案 0 :(得分:3)

重要提示

MsTest不保证执行顺序,并且运行之间的顺序可能不同。 If you need to rely on order you'll need to created an Ordered Test,VS Premium / Enterprise功能除非您使用Visual Studio 2015更新2,否则会将其带到专业版。

测试执行可以交错,反弹并做各种疯狂的事情。虽然在某些版本的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个线程上执行。传统的测试运行器不会以任何方式约束测试。如果可以的话,它将并行运行所有测试,并且没有特定的命令或保护。您可以在下面的屏幕截图中看到:

enter image description here

除非你的testSettings明确提到了并行性,否则测试将按顺序运行,但没有特定的顺序。我怀疑它将使用已编译汇编或字母顺序的IL顺序。源文件中的顺序绝对不是使用的顺序。

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

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

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