有没有办法按顺序使用MSTests运行单元测试?

Sam*_*han 35 c# unit-testing visual-studio-2008

我在一个主要是单线程,单用户的应用程序中工作.这里和那里有一些工作线程,它们只使用线程安全对象和类.单元测试实际上是测试具有多个线程的那些(为测试明确创建),并且它们测试正常.

在测试非线程安全的业务对象和子系统时,VSTS单元测试失败.它们可以不是线程安全的,这就是应用程序使用它们的方式.

但是,每个TestMethod的"一个线程"的MS测试方法会让我们失望.我必须在许多单元测试类中实现对象锁,只是为了确保测试一个接一个地运行(我真的不关心顺序,但是我不能让两个测试方法在同一个对象上运行同一时间).

代码如下所示:

[TestClass]
public class TestSomeObject
{
   static object turnStile = new object();
...
   [TestMethod]
   public void T01_TestThis()
   {
      lock(turnStile)
      {
      .. actual test code
      }
   }

   [TestMethod]
   public void T02_TestThat()
   {
      lock(turnStile)
      {
      -- actual test code
      }
   }

}
Run Code Online (Sandbox Code Playgroud)

是否有更好/更优雅的方式使测试顺序进行?

Rob*_*vey 28

使用有序测试.

测试>新测试>有序测试

测试>新测试

有序测试

  • 窗口底部出现“不能在有序测试中使用基于 MSTest V2 的测试”。好的。 (2认同)

flq*_*flq 19

有一个"有序测试"的概念,您可以在其中按顺序列出测试.它更适合确保某个连续的顺序,但我不知道如果B不等待A完成,那将是多么可能.

除此之外,不幸的是你的测试相互干扰.每个测试都可以使用Setup/TearDown方法,这样就可以将测试彼此隔离开来.

  • 不幸的是,MSTest在同一个应用程序域中运行所有测试,这使得测试首先可能会相互干扰. (4认同)

HB *_*AAM 18

你可以使用播放列表

右键单击测试方法 - >添加到播放列表 - >新播放列表

然后,您可以指定执行顺序 在此输入图像描述


Col*_*itz 13

对于每个测试执行,您可以特别要求使用互斥锁,无论是在要序列化的特定测试中,还是在类中的所有测试中(无论共享相同的互斥锁字符串).

对于整个测试类,您可以使用TestInitialize和TestCleanup属性,如下所示:

private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString");

[TestInitialize]
public void Initialize()
{
    testMutex.WaitOne(TimeSpan.FromSeconds(1));
}

[TestCleanup]
public void Cleanup() {
    testMutex.ReleaseMutex();
}
Run Code Online (Sandbox Code Playgroud)

要明确这不是测试的特征,任何锁定结构都应该起作用.我在这种情况下使用系统提供的互斥锁:https://msdn.microsoft.com/en-us/library/system.threading.mutex(v = vs.110).aspx


Sam*_*han 8

我终于使用了有序的测试方法.它运作良好.

但是,我有一段时间让它与NAnt构建一起工作.在构建中运行有序测试列表需要在MSTest调用块中使用/ testmetadata和/ testlist开关.关于这些的文档是粗略的,使用类型描述.我全都谷歌搜索"MSTest/testmetadata/testlist"的例子没有效果.

然而,诀窍很简单,我觉得有必要把它还给社区,以防其他人碰到同样的问题.

  1. 编辑测试元数据文件(扩展名为.vsmdi),并将新列表添加到测试列表(左窗格中树中的第一个节点.为其指定所需名称,例如'SequentialTests'.
  2. 如果您使用/ testcontainer开关进行MSTest调用,请将其删除.
  3. 为MSTest添加一个开关 - >/testmetadata:
  4. 为MSTEst/testlist添加开关:SequentialTests(或您使用的任何名称)

然后,MSTest仅运行您创建的测试列表中列出的测试.

如果有人有更好的方法,我想听听它!