9

我以为我了解 MbUnit 的并行测试执行是如何工作的,但是我看到的行为与我的预期有很大不同,我怀疑我错过了一些东西!

我有一组希望同时运行的 UI 测试。所有测试都在同一个程序集中,分为三个不同的命名空间。所有的测试都是完全独立的,所以我希望它们都可以并行执行。

为此,我在 AssemblyInfo.cs 中添加了以下内容:

[assembly: DegreeOfParallelism(8)]

[assembly: Parallelizable(TestScope.All)]

我的理解是,程序集属性的这种组合应该考虑所有测试[Parallelizable],并且测试运行程序在执行期间应该使用 8 个线程。我的个人测试都标有该[Test]属性,仅此而已。它们都不是数据驱动的。

但是,我实际看到的最多是使用了 5-6 个线程,这意味着我的测试运行花费的时间比应有的要长。

我错过了什么吗?我是否需要做任何其他事情来确保跑步者正在使用我的所有 8 个线程?

注意无论我使用哪个跑步者,行为都是相同的。GUI、命令行和 TD.Net 运行器的行为都与上述相同,再次让我认为我错过了一些东西。

编辑:正如评论中所指出的,我正在运行 MbUnit 的 v3.1(更新 2 build 397)。文档表明程序集级别属性是可用的[parallelizable],但它似乎也引用了框架的 v3.2,尽管它还不可用。

编辑2:为了进一步澄清,我的程序集结构如下:

assembly
- namespace
   - fixture
      - tests (each carrying only the [Test] attribute)
   - fixture
      - tests (each carrying only the [Test] attribute)
- namespace
   - fixture
      - tests (each carrying only the [Test] attribute)
   - fixture
      - tests (each carrying only the [Test] attribute)
- namespace
   - fixture
      - tests (each carrying only the [Test] attribute)
   - fixture
      - tests (each carrying only the [Test] attribute)

编辑 3:好的,我现在注意到,如果我一次只运行一个夹具,同时运行的最大测试数始终为 8。一旦我选择多个夹具,它就会下降到 5 或 6。如果我获取两个夹具的内容(目前它们每个都包含 12 个测试)并将它们放入同一个夹具(一个夹具中总共有 24 个测试),该夹具也将始终同时运行 8 个测试。

这似乎表明这不是单个测试中的问题,而是装配级别属性如何渗透到夹具,或者测试运行程序如何使用这些属性。

此外,我还观察到(在运行两个固定装置时),一旦两个固定装置中的一个完全执行,当运行器回到只运行一个固定装置时,它就会开始同时执行更多测试。现在对我来说,当第二个夹具中还有 7 个测试要运行时,第一个夹具就完成了执行。一旦发生这种情况,同时运行的测试数量就会从之前的 5 或 6 个跃升至最大可用的 7 个。

4

3 回答 3

6

根据Gallio v3.0.6的发行说明:

MbUnit 可帮助您充分利用多核 CPU。标记任何测试[Parallelizable],它将被允许与同一夹具中的其他可并行测试并行运行。

夹具也可以标记为可并行化,以使它们能够与其他可并行化的夹具并行运行。

替代文字

请注意,如果您希望夹具中的所有测试都被认为是可并行的,那么您仍然需要添加[Parallelizable]到它们中的每一个。(我们可能会在以后根据用户反馈在夹具或装配级别添加一个功能来设置它。)

另请注意,仅仅因为测试或夹具被标记为可并行化并不意味着它将与其他测试并行运行。为了效率,我们根据配置的并行度来限制活动测试线程的数量。如果您希望特定数量的测试实例彼此并行运行,请考虑使用[ThreadedRepeat].

并行度设置控制 MbUnit 将尝试彼此并行运行的最大测试数。默认情况下,并行度等于您拥有的 CPU 数量,或至少 2 个。

如果您不喜欢默认值,那么您可以像这样在程序集级别覆盖并行度:

替代文字

我不知道它是否有帮助。也许 Jeff 可以提供更多细节,因为他已经实现了该功能。

于 2010-06-03T16:47:20.683 回答
0

遇到同样的问题,我的发现

  • [assembly: Parallelizable(...)] 在程序集级别覆盖fixture Parallelizable 属性,将导致一次运行一个fixture 测试,但在fixture 并行级别。似乎最多可并行连接 5-6 个灯具。
  • 夹具级别的 [Parallelizable(TestScope.Descendants)] 将导致夹具一次运行一个,但测试并行运行。似乎没有最大并行测试。

最终由于夹具并行限制的装配级别约束,唯一的方法是使用夹具级别属性并让夹具测试并行运行。

我建议为每个夹具创建更少的夹具和更多的测试来解决这个问题。也许您总是可以为每个装配夹具启动多个跑步者。

可耻的是这种情况。

于 2014-05-08T11:58:15.577 回答
-1

一次运行超过 5 个测试时,覆盖不起作用。我们在 Sauce 实验室有 25 个系统可以一次执行 25 个脚本,我们将 DegreeOfParallelism 覆盖到 20 个,一次只执行 5 个。[程序集:DegreeOfParallelism(20)] - 不适用于 Mbunit

于 2014-08-22T07:55:11.370 回答