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

Ben*_*enA 9 c# parallel-processing mbunit automated-tests

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

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

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

[assembly: DegreeOfParallelism(8)]

[assembly: Parallelizable(TestScope.All)]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑:正如评论中所指出的,我正在运行MbUnit的v3.1(更新2版本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)
Run Code Online (Sandbox Code Playgroud)

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

这似乎表明它不是单个测试中的问题,而是组装级别属性如何渗透到夹具,或者测试运行器如何消耗这些属性.

此外,我还观察到(当运行两个灯具时),一旦完成两个灯具中的一个,跑步者开始执行更多测试,当它回到仅运行一个灯具时.对我来说,当第二个灯具中还有7个测试要运行时,第一个灯具会完成执行.一旦发生这种情况,同时运行的测试数量会从之前的5或6跳到最大可用的7.

Yan*_*vin 6

按照发行说明加利奥 v3.0.6:

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

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

替代文字

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

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

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

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

替代文字

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