【发布时间】:2019-06-23 17:03:28
【问题描述】:
我正在运行两个并行共享资源的测试。
我预计 Test1 会失败,但结果是 MsTestV2 创建了测试类的新实例,因此成员变量没有共享。
这通过检查每个测试的对象哈希码来验证,并检查构造函数被调用了多少次。
[TestClass]
public class ParallelizationTest
{
private int psw = 0;
public ParallelizationTest()
{
Console.Out.WriteLine("Ctor: ParallelizationTest");
}
[TestMethod]
public void Test1()
{
Console.Out.WriteLine("Test1 started with HashCode: " + GetHashCode());
Thread.Sleep(5000);
Assert.AreEqual(psw, 0);
Console.Out.WriteLine("Test1 ended");
}
[TestMethod]
public void Test2()
{
Console.Out.WriteLine("Test2 started with HashCode: " + GetHashCode());
psw = 123;
Assert.AreEqual(psw, 123);
Console.Out.WriteLine("Test2 ended");
}
}
MsTestV2 配置为(Workers 设置为 2):
<RunSettings>
<RunConfiguration>
<TargetPlatform>x86</TargetPlatform>
<MaxCpuCount>1</MaxCpuCount>
<DisableParallelization>false</DisableParallelization>
<TestSessionTimeout>1000000</TestSessionTimeout>
</RunConfiguration>
<MSTest>
<Parallelize>
<Workers>2</Workers>
<Scope>MethodLevel</Scope>
</Parallelize>
</MSTest>
</RunSettings>
MsTest 框架是否保证创建测试类的新实例?
【问题讨论】:
-
为什么不尝试更多的测试呢?
-
我可以尝试 1000+,但我认为它仍然无法回答我的问题。可能是我的设置、操作系统或任何其他可能影响它的东西。
-
您在那里设置了 2 个工作线程,所以会发生两个线程获取测试方法。我认为提供两个线程 1000 种测试方法应该可以帮助您做出有根据的猜测。我还没有尝试过,但我希望仍然使用两个类实例,并假设开发人员选择
MethodLevel意味着开发人员保证(对他自己)不会有任何资源共享。我找不到任何类型的微软书面文档说“每个并行化的测试方法都有自己的类实例”,所以唯一真正的回答方法是查看 MSTest 源,稍后可能会更改。 -
所以不,我不认为这一定会发生,直到微软声明并成为在未来版本中不会意外改变的记录行为。
标签: c# .net parallel-processing mstest