我有一个测试(理论),它很慢,有一堆测试用例.
所以我希望他们同时运行.
所以我希望他们同时运行.
我创建了一个简单的例子:
[Theory] [MyTestData] public void MyTheory(int num,int sleep) { Console.WriteLine("{0:HH:mm:ss.ffff} - Starting {1} - Sleeping {2}",DateTime.Now,num,sleep); Thread.Sleep(sleep); Console.WriteLine("{0:HH:mm:ss.ffff} - Finished {1} - Sleeping {2}",sleep); } [AttributeUsage(AttributeTargets.Method)] public class MyTestDataAttribute : DataAttribute { public override IEnumerable<object[]> GetData(MethodInfo testMethod) { yield return new object[2] { 1,5000 }; yield return new object[2] { 2,2000 }; yield return new object[2] { 3,4000 }; } }
运行测试的命令行:
"\packages\xunit.runner.console.2.0.0\tools\xunit.console" "\Projects\xUnitTest\xUnitTest\bin\Debug\xUnitTest.dll" -parallel all > xUnitResult.txt
结果如下:
xUnit.net console test runner(64-bit.NET 4.0.30319.42000) Copyright(C) 2015 Outercurve Foundation. Discovering: xUnitTest Discovered: xUnitTest Starting: xUnitTest 21:55:39.0449 - Starting 2 - Sleeping 2000 21:55:41.0627 - Finished 2 - Sleeping 2000 21:55:41.0783 - Starting 1 - Sleeping 5000 21:55:46.0892 - Finished 1 - Sleeping 5000 21:55:46.0892 - Starting 3 - Sleeping 4000 21:55:50.0989 - Finished 3 - Sleeping 4000 Finished: xUnitTest === TEST EXECUTION SUMMARY === xUnitTest Total: 3,Errors: 0,Failed: 0,Skipped: 0,Time: 11,137s
这是相当连续的.
我敢肯定有可能让它平行.
解决方法
从xUnit 2.1开始,目前无法实现这一点.根据
parallelization docs,
By default,each test class is a unique test collection. Tests within the same test class will not run in parallel against each other.
文档没有明确说明的是:
> xUnit中最小的“可并行化”单元是一个集合
>同一类中的测试无法在不同的集合中进行
通过扩展,不可能有并行化理论,因为理论不能分为多个类.
在您的情况下,这意味着您至少有两个选项:
>重构您的代码,以便将抽出大量时间的内容抽象出去.例如,假设您必须运行一些业务逻辑,然后进行数据库调用.如果您可以将可测试的业务逻辑分成另一个类,则可以针对该类运行理论(不是并行,但是在<1毫秒内),并分别测试慢速数据访问代码.>如果您的测试用例足够少,只需为每个测试用例创建一个新类,并使用Fact而不是Theory.您甚至可以将它们全部放在一个文件中.它更冗长,你失去了使用理论的“酷”因素,但你会得到并行执行.