Visual Studio 2012可以并行运行单元测试吗?Visual Studio 2010有一个选项可以执行此操作:
...但我在Visual Studio 2012中找不到类似的东西.我尝试了参考文章中描述的过程,但即使加载相同的测试设置文件,我也无法并行运行测试.
我有大量的集成测试来测试网站服务器。大多数这些测试都可以并行运行。但是,我有一些更改设置,并且在并行运行时可能会导致彼此失败。
作为一个简化的示例,假设我进行了以下测试:
TestPrice_5PercentTax
TestPrice_10PercentTax
TestPrice_NoTax
TestInventory_Add10Items
TestInventory_Remove10Items
Run Code Online (Sandbox Code Playgroud)
库存测试不会互相妨碍,并且不受价格测试的影响。但价格测试将改变Tax设置,因此,如果两者5并行10运行,最终可能会在完成10之前更改设置,并且会失败,因为它看到了 10% 的税,而不是预期的 5%。55
我想为三个价格测试定义一个类别,并说它们可能不会同时运行。它们可以与任何其他测试同时运行,但不能与其他价格测试同时运行。MSTest 有办法做到这一点吗?
我们已经并行运行了多年的单元测试(有和没有代码覆盖),遵循以下说明: 如何并行运行单元测试(MSTest)? 在这里: 并行运行单元测试
但是,Visual Studio 2017的最新更新(版本15.5.0或15.5.1及更高版本)似乎打破了这一点,每当我尝试使用自定义测试设置文件并执行代码覆盖时,我现在都会收到以下错误分析:
[12/29/2017 1:35:10 PM Error] Microsoft.VisualStudio.TestPlatform.ObjectModel.SettingsException: Data collectors configured via run settings are not supported with embedded test settings. Please see https://aka.ms/vstest-configure-datacollector for more information. Run settings:
Run Code Online (Sandbox Code Playgroud)
我已在另一个系统上更新,重新启动并验证了此问题.
当恢复到默认设置(没有自定义测试设置文件)并使用VS 2015更新2中引入的"并行运行测试"按钮时,它似乎只是忽略按钮设置并连续运行测试(无论您是否进行代码覆盖) ).
我查看了错误中提供的链接(https://github.com/Microsoft/vstest-docs/blob/master/docs/analyze.md),但它没有帮助澄清问题,除了可能表明是的,改变了.
如果我关闭自定义设置文件,测试运行得很好,但运行时间大约是7倍,这非常令人沮丧.
如何在VS 2017 15.5+中使用并行单元测试执行?
c# unit-testing vs-unit-testing-framework visual-studio-2017
最近发现由于未指定InvariantCulture何时将文本解析为数字而导致的错误后,我想加强我们的单元测试,以便他们能够发现问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新运行现有测试方法之一,然后将区域性设置回来。不幸的是,文化的变化也影响了其他测试方法。有没有办法做到这一点,使测试不相互作用?
我确实发现将文化设置测试放在文件的最后可以“解决”问题,但我讨厌依赖测试顺序,因为它不能得到保证。在下面的示例中,系统文化为"en-EN"、TestMethod1和 的情况下TestMethod2,如果单独运行,将会成功。如果我一起运行所有方法,它们都会失败。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethodGerman()
{
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
TestMethod1();
Thread.CurrentThread.CurrentCulture = originalCulture;
}
[TestMethod]
public void TestMethod1()
{
double value = Double.Parse("3.00");
Assert.AreEqual(value, 3.0);
}
[TestMethod]
public void TestMethod2()
{
double value = Double.Parse("4.00");
Assert.AreEqual(value, 4.0);
}
}
Run Code Online (Sandbox Code Playgroud)