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

时间:2009-10-09 16:30:20

标签: 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
      }
   }

}

是否有更好/更优雅的方式让测试依次运行?

6 个答案:

答案 0 :(得分:26)

使用Ordered Test

测试>新测试>有序测试

Test > New Test

Ordered Test

答案 1 :(得分:19)

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

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

答案 2 :(得分:18)

您可以使用播放列表

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

然后您可以指定执行顺序 enter image description here

答案 3 :(得分: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();
}

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

答案 4 :(得分:8)

我终于使用了有序的测试方法。效果很好。

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

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

  1. 编辑测试元数据文件(扩展名为.vsmdi),然后添加新列表 到测试列表(左侧树中的第一个节点) 窗格。给它你想要的名字,例如'SequentialTests'。
  2. 如果您使用/ testcontainer开关进行MSTest调用,请将其删除。
  3. 为MSTest添加开关 - > / testmetadata:
  4. 为MSTEst添加一个开关   / testlist:SequentialTests(或您使用的任何名称)
  5. 然后,MSTest仅运行您创建的测试列表中列出的测试。

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

答案 5 :(得分:2)

我使用了有序测试,也只是使用命令

在jenkins上轻松配置它们

MSTest /testcontainer:" orderedtestfilename.orderedtest" / resultsfile:" testresults.trx"