MbUnit的[Parallelizable]和DegreeOfParallelism究竟是如何工作的?

时间:2010-06-03 13:13:29

标签: c# automated-tests mbunit parallel-processing

我以为我理解MbUnit的并行测试执行是如何工作的,但我看到的行为与我的怀疑有很大不同,我怀疑我错过了什么!

我有一组我希望同时运行的UI测试。所有测试都在同一个程序集中,分为三个不同的名称空间。所有测试都是完全独立的,所以我希望所有这些测试都有资格进行并行执行。

为此,我将以下内容放在AssemblyInfo.cs中:

[assembly: DegreeOfParallelism(8)]

[assembly: Parallelizable(TestScope.All)]

我的理解是这种组合属性的组合应该使所有测试都被认为是[Parallelizable],并且测试运行者应该在执行期间使用8个线程。我的个别测试标有[Test]属性,没有别的。它们都不是数据驱动的。

然而,我实际看到的最多使用的是5-6个线程,这意味着我的测试运行时间比应该的时间长。

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

N.B。无论我使用哪个跑步者,行为都是一样的。 GUI,命令行和TD.Net跑步者都表现得与上述相同,再次让我觉得我错过了什么。

编辑:正如评论中所指出的,我正在运行MbUnit的v3.1(更新2版本397)。 documentation表明程序集级[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。

3 个答案:

答案 0 :(得分:6)

根据release note v3.0.6的Gallio

  

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

     

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

     

alt text

     

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

     

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

     

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

     

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

     

alt text

我不知道它是否有帮助。也许杰夫可以提供更多细节,因为他实施了这个功能。

答案 1 :(得分:0)

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

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

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

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

羞耻就是这种情况。

答案 2 :(得分:-1)

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