【问题标题】:How to run a list of tests with VsTest.Console如何使用 VsTest.Console 运行测试列表
【发布时间】:2015-12-25 18:23:02
【问题描述】:

如何使用 vstest.console.exe 运行测试列表? .vsmdi 格式提供了一种指定测试列表的方法,但该格式已被弃用(?)。

我可以在命令行上运行一个明确的测试列表,这基本上完全符合我的要求,但是如果测试的数量很大(比如几百个),那么我将用完命令行空间!

vstest.console MyTests.dll /Tests:Test1,Test2

我有没有办法欺骗 vstest.console.exe 运行以任何其他方式定义的测试列表

(编辑:强调)

注意:我不想更改测试代码,例如添加测试类别属性或更改命名方案,以便名称匹配将选择子集。我需要它来运行测试列表。

我能想到的最好的办法是在最大命令行长度内尽可能多地运行,然后重复直到集合完成,然后合并。但是,如果有某种方法可以加载旧版 vsmdi 列表或类似的列表,那就容易多了。

vstest.console MyTests.dll < testnames.txt

vstest.console MyTests.dll /Testlist:testnames.txt

【问题讨论】:

  • 您应该改用 /TestCaseFilter 开关。它允许您控制运行的内容。这是 [msdn 链接] (msdn.microsoft.com/en-us/library/jj155800.aspx)
  • 我不明白这如何让我运行明确的测试列表?测试没有例如一个共同的前缀。如果我让过滤器明确匹配名称 (Test1 | Test2 | ..) 然后我回到我开始的地方,将用完命令行空间!
  • 过滤器支持的不仅仅是类名。在您的情况下,您可能应该使用“TestCategory”过滤器 - 然后使用 TestCategory 属性标记要运行的测试类。这允许您以多种方式对测试进行分类,并且只在命令行中使用过滤器运行您需要的内容。
  • 我无法更改测试(类名、类别、命名空间等)。我想从给定列表中运行一个子集(例如其中的 1000 个),可以在运行之间动态更改。
  • 好吧,那么我能想到的唯一选择是将它们分成更小的子集,并在每个块上多次运行 vstest.console。听起来您正处于对测试课程的控制有限的困境中。

标签: visual-studio mstest vstest


【解决方案1】:

您可以在特定格式的文本文件中列出您的测试,然后像这样将其输入 vstest.console.exe。假设文件名为 mytests.orderedtest:

vstest.console mytests.orderedtest

mytests.orderedtest 必须采用特定格式。有一种简单的方法可以从 Visual Studio 创建这样的测试,然后您可以查看其内容。

首先,在 Visual Studio 中,右键单击解决方案资源管理器中的项目,然后选择添加/有序测试。这将创建一个带有漂亮 UI 的有序测试文件,您可以在其中添加测试。因此,从列表中选择您的测试:Test1,Test2。这将创建一个看起来像这样的文件:

<?xml version="1.0" encoding="UTF-8"?>
    <OrderedTest name="mytests" storage="c:\src\MyTests\MyTests.orderedtest" id="ed4d22c5-ab9a-4ebd-954f-65ac4c034338" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <TestLinks>
    <TestLink id="14c6766b-c22b-130a-ddb0-53d5ddd6eb1d" name="Test1" storage="..\bin\debug\MyTests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <TestLink id="24c6766b-c22b-130a-ddb0-53d5ddd6eb1d" name="Test2" storage="..\bin\debug\MyTests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </TestLinks>
</OrderedTest>

如果您要在 Visual Studio 之外手动创建, 请注意,id 属性中的 GUID 很重要。这是在不同的完全限定类名之间区分具有相同名称的测试的唯一方法。即id由namespace+class+method组成。这篇文章解释一下:http://blogs.msdn.com/b/aseemb/archive/2013/10/06/how-to-create-an-ordered-test-programmatically.aspx

这是一个将完全限定的方法名称转换为这些 GUID 之一的例程:

// convert the test (<Name space name>.<class name>.<test method name>) to a GUID
static Guid GuidFromString(string data) 
{
    SHA1CryptoServiceProvider provider = new SHA1CryptoServiceProvider();
    byte[] hash = provider.ComputeHash(System.Text.Encoding.Unicode.GetBytes(data));
    byte[] toGuid = new byte[16]; 
    Array.Copy(hash, toGuid, 16);
    return new Guid(toGuid); 
}

【讨论】:

  • 你确定吗?命令行文档没有提到这一点(msdn.microsoft.com/en-us/library/jj155796.aspx),当我尝试这个时,它只是加载 dll 并运行它(所有测试)。这看起来就像 ols mstest.exe 命令行样式
  • 我确定。我试了几次。我还在 StackOverflow 上找到了另一个显示相同内容的参考:stackoverflow.com/a/29649319/75129
  • 谢谢,会试试的。顺便说一句,另一个答案只是省略了测试程序集并将有序测试文件作为输入文件vstest.console somefile.orderedtest,也许这就是需要做的。
  • 这行得通,只需要非常小心地在文件中为特定版本的 VS 获取程序集引用。来自 vstest.console 的可怕错误消息,基本上如果你弄错一个字符,它只会发现没有测试:/ 谢谢!
  • 谢谢安德烈斯。我更新了它以反映不需要指定 .dll。那么你接受这个答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2017-11-29
  • 2018-07-30
  • 1970-01-01
  • 2016-03-24
  • 2020-12-26
  • 2019-07-19
相关资源
最近更新 更多