如何为类中的所有测试设置测试类别

本文关键字:测试 设置 测试类 | 更新日期: 2023-09-27 18:07:26

我正在使用MSTest,并且我想要一次为测试类中的所有方法设置相同的测试类别,而不需要为每个方法单独设置TestCategory属性。如何做到这一点?

最方便和明显的方法是在类上设置TestCategory属性,但它只能应用于方法。

最终目标是在TFS签入的测试运行期间跳过集成测试。

如何为类中的所有测试设置测试类别

为了能够在class级别设置[TestCategory]属性,请使用NuGet安装" MSTest V2 " TestFramework。

裁判:https://blogs.msdn.microsoft.com/devops/2016/06/17/taking-the-mstest-framework-forward-with-mstest-v2/

我一直在寻找做类似的事情,我已经到达了一个解决方案,非常适合我的目的。

这并不解决了在每个类的基础上应用TestCategory的问题,但是您可以使用/test:命令行参数为mstest指定一个搜索字符串来匹配完全限定方法名称的任何部分。这意味着您通常可以匹配类、名称空间或您可以到达的任何与目标测试匹配的搜索字符串。如果那样不行,你可以多次使用/test:参数。即:

> mstest /testcontainer:My.dll /test:My.FullyQualified.Namespace 
    /test:My.FullyQualified.OtherNamespace.OtherClass

更多信息编辑:

在类级别添加TestCategory属性现在可以在MSTest V2中使用,如下面的NomadeNumerique的回答所述。细节

最终目标是在TFS上运行测试期间跳过集成测试登机手续。

还有其他方法可以做到这一点。在TFS构建中,您可以根据单元测试的程序集名称设置要运行的单元测试。

作为默认行为,它将运行名称中包含"test"的程序集中的所有单元测试。一个简单的修复方法是将集成测试重命名为不包含"test"的名称。


如果你确实想使用类别,你可以尝试使用AOP。例如,使用Postsharp,您可以在集成测试程序集中创建一个方面,将属性放在方法上。如果所有测试都分组在一个dll中或每个集成测试类中,则为集成程序集中的所有公共方法启用方面。

绕过此限制的一种方法是将测试类别放在每个测试方法的开头。例如,将单元测试命名为

public void UnitTestDoSomething_ExpectThis()

和您的集成测试

public void IntegrationTestDoSomething_ExpectThis()

然后当您执行TFS查询以获得集成测试时,您可以执行

Field[Automated Test Name] with Operator[Contains] and Value[IntegrationTest]

虽然这不是一个完美的解决方案,但它将帮助您区分代码测试和TFS测试。或者,您可以查看区域和迭代路径。

您可以按"类名"分组到Test Explorer面板。

使用TestCategory属性你不能解决你的问题,仅仅因为c#中的属性是元数据,不能用作动态值

在vs2017中这是可能的(并且看起来是VS2012更新1的一部分)。

你可以把[TestCategory("Integration")]放在单元测试中的一个类上,并让它应用于所有的测试,同样地,[TestCategory(" unit ")]放在单元测试类上。

然后您可以使用Test Explorer的搜索栏根据Trait名称= Unit进行过滤,并且"运行所有"将只运行与您的搜索匹配的测试。

当您要在构建服务器上运行这些测试时,您可以使用/category:Unit之类的开关来只运行单元测试。