【问题标题】:MsTest parallelizationMsTest 并行化
【发布时间】: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


【解决方案1】:

MSTest 为每个测试方法创建一个新的 [TestClass] 实例。 MSTestV2 也会继续这种行为。 .runsettings 不会影响此行为。
请考虑在MSTestV2 doc repo 上提交问题以澄清文档。

【讨论】:

猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多