我正在使用MSTest,我想一次为测试类中的所有方法设置相同的测试类别,而不是单独为每个方法设置 TestCategory 属性。如何才能做到这一点?
最方便和最明显的方法是在类上设置 TestCategory 属性,但它只能应用于方法。
最终目标是在 TFS 签入的测试运行期间跳过集成测试。
我正在使用MSTest,我想一次为测试类中的所有方法设置相同的测试类别,而不是单独为每个方法设置 TestCategory 属性。如何才能做到这一点?
最方便和最明显的方法是在类上设置 TestCategory 属性,但它只能应用于方法。
最终目标是在 TFS 签入的测试运行期间跳过集成测试。
为了能够在类[TestCategory]
级别设置属性,请使用 NuGet 安装“MSTest V2”TestFramework。
我一直在寻求做类似的事情,并且我已经找到了一个非常适合我的目的的解决方案。
这并不能解决基于每个类应用 TestCategory 的问题,但您可以使用/test:
命令行参数 formstest
指定搜索字符串以匹配测试的完全限定方法名称的任何部分。这意味着您通常可以匹配类、名称空间或任何您可以到达的搜索字符串,以匹配目标测试。如果不这样做,您可以/test:
多次使用该参数。IE:
> mstest /testcontainer:My.dll /test:My.FullyQualified.Namespace
/test:My.FullyQualified.OtherNamespace.OtherClass
编辑:
TestCategory
正如下面 NomadeNumerique 的回答所述,MSTest V2 现在可以在类级别添加属性。细节
最终目标是在 TFS 签入的测试运行期间跳过集成测试。
还有其他方法可以做到这一点。在您的 TFS 构建中,您可以设置要运行的单元测试,具体取决于它们的程序集名称。
作为默认行为,它将在名称中包含“test”的程序集中运行所有单元测试。一个简单的解决方法是将您的集成测试重命名为不包含“测试”的名称。
如果您确实想使用类别,您可以尝试使用 AOP。例如,使用 Postsharp,您可以在集成测试程序集中创建一个方面,将属性放在方法上。如果所有测试都分组在一个 dll 或每个集成测试类中,则为集成程序集中的所有公共方法启用方面。
解决此限制的一种方法是将测试类别放在每个测试方法的开头。例如,命名您的单元测试
public void UnitTestDoSomething_ExpectThis()
和你的集成测试
public void IntegrationTestDoSomething_ExpectThis()
然后,当您执行 TFS 查询以获取集成测试时,您可以执行
Field[Automated Test Name] with Operator[Contains] and Value[IntegrationTest]
虽然这不是一个完美的解决方案,但它会帮助您区分代码和 TFS 中的测试。或者,您可以查看区域和迭代路径。
您可以按“类名”分组到测试资源管理器面板中。
使用测试 TestCategory 属性无法解决问题,因为 C# 中的属性是元数据,不能用作动态值。
在 VS 2017 中这是可能的(并且看起来是VS2012 update 1的一部分)。
您可以将 [TestCategory("Integration")] 放在单元测试中的类上并将其应用于所有测试,同样将 [TestCategory("Unit")] 放在单元测试类上。
然后,您可以使用测试资源管理器的搜索栏按特征名称 = 单位进行过滤,“全部运行”将仅运行与您的搜索匹配的测试。
当您在构建服务器上运行这些测试时,您可以使用 /category:Unit 之类的开关来仅运行单元测试。