65.9K
CodeProject 正在变化。 阅读更多。
Home

使用全面日志增强 xUnit 集成测试

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.12/5 (3投票s)

2023年10月19日

CPOL

1分钟阅读

viewsIcon

8071

通过详细的日志记录,增强您的 xUnit 测试,以便获得更清晰的洞察力和更轻松的调试。

引言

集成测试确保应用程序的各个组件无缝协作。对于使用 xUnit 进行集成测试的开发人员来说,一个局限性在于测试期间日志会消失。没有这些日志,很难理解测试的行为。本文介绍了 ConnectingApps.Xunit.TestLogger NuGet 包,旨在在 xUnit 集成测试期间恢复日志记录功能,从而深入了解测试行为。

背景

在 .NET 世界中,WebApplicationFactory 类是为 Web 应用程序设置集成测试的基本工具。该类是 Microsoft.AspNetCore.Mvc.Testing 包的一部分,允许开发人员建立和配置专门用于测试的 Web 应用程序实例。关于如何使用 WebApplicationFactory 进行集成测试的全面指南可以在 Microsoft 的官方 文档 中找到。

Using the Code

为了使用 ConnectingApps.Xunit.TestLogger NuGet 包重新引入日志记录功能,需要在测试的设置中进行轻微调整。它支持 .NET 6、.NET 7、.NET 8 和 .NET 9(预览版)。

以前,您会像这样设置 WebApplicationFactory

public NoLoggingTest()
{
    _factory = new WebApplicationFactory<Program>();
}

使用 ConnectingApps.Xunit.TestLogger 包,请使用以下方法

public ImprovedLoggingTest(ITestOutputHelper output)
{
    _factory = new TestLoggerWebApplicationFactory<Program>(output);
}

为了更好地理解这一点,让我们来看一个详细的控制器方法

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<weatherforecast> Get()
{
    // first do some logging
    _logger.LogInformation("This should be logged during testing");
    // Then return an object like it is done in the Visual Studio Template
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = Random.Shared.Next(-20, 55),
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]
    })
    .ToArray();
}

这是该方法的相应测试

using ConnectingApps.Xunit.TestLogger;
using System.Net;
using Xunit.Abstractions;

public class ImprovedLoggingTest : IDisposable
{
    private readonly TestLoggerWebApplicationFactory<Program> _factory;
    private readonly HttpClient _client;

    public ImprovedLoggingTest(ITestOutputHelper output)
    {
        _factory = new TestLoggerWebApplicationFactory<Program>(output);
        _client = _factory.CreateClient();
    }

    [Fact]
    public async Task ReadInTestOutputIfSomethingIsLogged()
    {
        var response = await _client.GetAsync("/WeatherForecast");
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }

    public void Dispose()
    {
        _factory.Dispose();
        _client.Dispose();
    }
}

为了更全面地了解和获取更多示例,可以在 GitHub 上找到完整的源代码和相关文档。

以下是使用 ConnectingApps.Xunit.TestLogger 时日志记录的外观可视化表示

关注点

引入 ConnectingApps.Xunit.TestLogger 包为长期存在的问题提供了一个简单的解决方案。它与现有 xUnit 测试的无缝集成以及提供全面日志记录的能力,增强了开发人员的调试体验。

历史

© . All rights reserved.