如何在 xUnit 中设置包含测试的 class 的显示名称?

How to set display name for class that contains tests in xUnit?

xUnit 为 [Fact] 属性提供了 DisplayName 属性 来指定我们的测试应该如何在 Visual Studio 的测试资源管理器中显示。例如:

public class BooksIntegrationTests
{
    [Fact(DisplayName = "GET /api/books returns http status code 200")]
    public Task Get_Books_ReturnsCollectionOfBooks()
    {
        // ... test code
    }
}

因此,测试资源管理器不再显示方法名称 Get_Books_ReturnsCollectionOfBooks,而是显示更友好的测试名称 GET /api/books returns http status code 200

但是是否有等效的方法在包含这些测试的 class 上指定 DisplayName?我希望测试资源管理器显示类似 Integration tests for Books API resource 的内容,而不仅仅是 class 名称 BooksIntegrationTests.

有没有办法通过一些 xUnit class 属性来做到这一点?

我发现在 Visual Studio 测试资源管理器 window 中以更友好的名称对 xUnit 测试进行分组的唯一方法是使用 Traits 功能,然后使用 UI 选项在测试资源管理器中按特征而不是 Class 对测试进行分组。 示例代码:

public class BooksIntegrationTests
{
    [Xunit.TraitAttribute("Category", "Integration tests for Books API resource")]
    [Fact(DisplayName = "GET /api/books returns http status code 200")]
    public void Get_Books_ReturnsCollectionOfBooks()
    {
        // ... test code
    }

    [Trait("Category", "Integration tests for Books API resource")]
    [Fact(DisplayName = "GET /api/books/book returns http status code 999")]
    public void Get_BookByISBN_ReturnsSingleBook()
    {
        // ... test code
    }
}

然后您的测试资源管理器将显示如下:

第一个 circled-in-red 按钮是 "Show Test Hierarchy" 按钮,它应该被删除select。就在它的右边是 "Group By..." 下拉菜单,单击它和 select 以按 "Traits" 分组。我使用了一个名为 "Category" 的特性来对两个 xUnit 测试进行分组,并发明了另一个测试 returns 一本书而不是一本书的集合。使用此视图,两个相关测试都显示在 "Category: Integration Tests for Books API Resource".

以上是针对VS2017的。我预计 VS2019 会是 same/similar.

我没有找到一种方法来完全你想做的,让分组依据"Class"在测试中显示更友好的名字探险家Window。我尝试在 AssemblyInfo.cs 文件中添加属性,更改项目属性,但没有任何方法可以更改 Class 视图。 可能有办法,但我没找到。希望这可以帮助您更接近您的目标。

P.S。 "Trait" 和 "TraitAttribute" 属性似乎是等效的并且可以互换。我在代码中展示了这两种形式来说明这一点。 "Trait" 似乎是属性的较新的首选形式,因为如果您选择 "Simplify" 名称,Visual Studio 会使用该形式。