44

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

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

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

4

6 回答 6

8

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

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

于 2018-06-14T19:37:28.543 回答
5

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

这并不能解决基于每个类应用 TestCategory 的问题,您可以使用/test:命令行参数 formstest指定搜索字符串以匹配测试的完全限定方法名称的任何部分。这意味着您通常可以匹配类、名称空间或任何您可以到达的搜索字符串,以匹配目标测试。如果不这样做,您可以/test:多次使用该参数。IE:

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

更多信息

编辑:

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

于 2014-07-09T20:51:39.097 回答
4

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

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

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


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

于 2014-04-09T11:16:00.127 回答
2

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

public void UnitTestDoSomething_ExpectThis()

和你的集成测试

public void IntegrationTestDoSomething_ExpectThis()

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

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

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

于 2013-04-11T18:48:57.377 回答
2

您可以按“类名”分组到测试资源管理器面板中。

使用测试 TestCategory 属性无法解决问题,因为 C# 中的属性是元数据,不能用作动态值。

于 2014-04-09T11:07:11.630 回答
1

在 VS 2017 中这是可能的(并且看起来是VS2012 update 1的一部分)。

您可以将 [TestCategory("Integration")] 放在单元测试中的类上并将其应用于所有测试,同样将 [TestCategory("Unit")] 放在单元测试类上。

然后,您可以使用测试资源管理器的搜索栏按特征名称 = 单位进行过滤,“全部运行”将仅运行与您的搜索匹配的测试。

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

于 2018-09-10T11:46:22.177 回答