强制MSTest使用单个线程

Pau*_*ell 34 unit-testing mstest visual-studio

鉴于此测试夹具:

[TestClass]
public class MSTestThreads
{
    [TestMethod]
    public void Test1()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }

    [TestMethod]
    public void Test2()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用MSTest通过Visual Studio或命令行运行测试会打印两个不同的线程号(但它们仍然按顺序运行).

有没有办法强制MSTest使用单个线程运行它们?

Bar*_*zKP 21

我用锁定解决了这个问题:

public static class IntegrationTestsSynchronization
{
    public static readonly object LockObject = new object();
}
Run Code Online (Sandbox Code Playgroud)
[TestClass]
public class ATestCaseClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        Monitor.Enter(IntegrationTestsSynchronization.LockObject);
    }

    [TestCleanup]
    public void TestCleanup()
    {
        Monitor.Exit(IntegrationTestsSynchronization.LockObject);
    }

    //test methods
}

// possibly other test cases
Run Code Online (Sandbox Code Playgroud)

这当然可以提取到基础测试类并重用.


det*_*pro 12

我已经花了不少时间让MSTest在一个大型项目中以单线程模式运行,这个项目大量使用nHibernate并且它不是线程安全的(不是问题,它只是没有)ISession.

我们花了更多时间编写代码来支持MSTest的多线程特性,因为 - 就我和我的团队知识而言 - 不可能在单线程模式下运行MSTest.

  • @Merlyn:这很重要,因为您不拥有的组件可能存在限制.正如Paul所提到的,WPF App类是一个很好的例子,针对它运行测试用例可能会因为线程所有权问题而失败.这种方式违背了测试的目的,因为您现在正在面对一个不可能的场景.(您的应用程序将只有一个App实例,因此所有线程都是相同的). (6认同)
  • 谢谢你的答案 - 我会放弃并切换回NUnit (2认同)
  • 我糊涂了.如果您的测试按顺序运行,那么它们是否在不同的线程上有什么关系呢?在这种情况下,线程安全性如何重要? (2认同)