Unit testing NUnit-我可以按键对测试进行分组,并在每个组中并行运行测试,但在每个组中串联运行测试吗?
我有一大套测试,目前正在系列运行。我希望尽可能使套件可并行化。我遇到的一个大问题是,有些测试要求以一种方式设置某些全局应用程序状态,而有些测试则要求以另一种方式设置。是否有一种方法可以使NUnit测试运行程序根据其所需的全局状态对我的测试进行分组,然后在每个组内并行运行测试,并修改组之间的全局状态 例如,假设有一个全局设置Unit testing NUnit-我可以按键对测试进行分组,并在每个组中并行运行测试,但在每个组中串联运行测试吗?,unit-testing,nunit,Unit Testing,Nunit,我有一大套测试,目前正在系列运行。我希望尽可能使套件可并行化。我遇到的一个大问题是,有些测试要求以一种方式设置某些全局应用程序状态,而有些测试则要求以另一种方式设置。是否有一种方法可以使NUnit测试运行程序根据其所需的全局状态对我的测试进行分组,然后在每个组内并行运行测试,并修改组之间的全局状态 例如,假设有一个全局设置Foo和一个自定义属性[RequiresFoo(X)],可用于注释测试需要的Foo值。在运行时,我希望NUnit将所有测试按其参数分组为RequiresFoo,将未标记的测试计
Foo
和一个自定义属性[RequiresFoo(X)]
,可用于注释测试需要的Foo
值。在运行时,我希望NUnit将所有测试按其参数分组为RequiresFoo
,将未标记的测试计算为具有一些默认值Foo
然后,对于每个组,我希望它
Foo=N
,其中N
是该组的Foo
值下面是一个伪代码示例 默认情况下,测试按如下顺序执行:
foreach (var t in allTests)
{
Run(t);
}
Parallel.ForEach(allTests, t => Run(t));
var grouped = allTests
.GroupBy(t => GetRequirementsFromCustomAttributes(t));
foreach (var g in grouped)
{
SetGlobalState(g.Key);
Parallel.ForEach(g, t => Run(t));
}
其基本并行行为如下所示:
foreach (var t in allTests)
{
Run(t);
}
Parallel.ForEach(allTests, t => Run(t));
var grouped = allTests
.GroupBy(t => GetRequirementsFromCustomAttributes(t));
foreach (var g in grouped)
{
SetGlobalState(g.Key);
Parallel.ForEach(g, t => Run(t));
}
我想要这样的东西:
foreach (var t in allTests)
{
Run(t);
}
Parallel.ForEach(allTests, t => Run(t));
var grouped = allTests
.GroupBy(t => GetRequirementsFromCustomAttributes(t));
foreach (var g in grouped)
{
SetGlobalState(g.Key);
Parallel.ForEach(g, t => Run(t));
}
正如你所说的问题,在努尼特还不可能。有一个已计划但尚未实施的特性,允许对可能不同时运行的测试进行任意分组 您的解决方法是使每个“组”都成为一个测试,因为NUnit只允许在测试上指定并行化。注意,所谓测试,我们指的是一个测试用例或一组测试,即fixture或namespace套件 将
[Parallelizable]
放在层次结构中任何位置的测试都会导致该测试与同一级别的其他测试并行运行。将[NonParallelizable]
放在它上面会导致相同的测试在隔离状态下运行
假设有五个装置要求值为Foo。您将使这些装置中的每一个都不可并行化。这样,他们中的任何一个都不能同时运行并干扰其他人
如果您想让这些fixture与其他非Foo fixture并行运行,只需将它们全部放在同一名称空间中,如Tests.foorequre
。
在该命名空间中创建一个SetupFixture
——可能是一个没有任何实际设置操作的虚拟。将[Parallelizable]
属性放在上面
然后,所有foo测试组将与其他测试并行运行,而各个装置将不会彼此并行运行。谢谢Charlie。我不知道名称空间装置。这可能就解决了问题。小小的技术修正:不管你做什么,我们都有名称空间套件。但是,如果在名称空间中创建SetUpFixture,它将接管名称空间套件的工作,并允许更高级别的一次性设置和拆卸。在本例中,我建议使用SetupFIxture只是为了给您一些属性可以显示的内容—属性不适用于名称空间?还是
[Parallelizable]
起到了作用?