您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

借助xUnit减少了生产问题

寒冰屋 发布时间:2020-06-07 16:35:34 ,浏览量:0

目录

介绍

背景

使用代码

兴趣点

考虑到使用xUnit编写许多测试的方式,需要改进两件事:测试需要更加真实,并应防止日志记录受限。使测试更切合实际,将减少生产问题的可能性。此外,测试日志记录的内容可以避免在出现生产问题时必须限制日志记录细节来解决问题的问题。本文介绍了如何预防xUnit测试中的此类问题。

介绍

生产问题是一个众所周知的问题。在大多数情况下,您不知道是什么引起了问题,因此首先要做的是读取日志。阅读日志后,开发团队可能会询问以下问题:

  1. 为什么没有记录我们期望记录的对象?
  2. 为什么我们找不到描述问题的警告或错误消息?
  3. 为什么我们找不到必须发生的异常?
  4. 为什么我们的测试没有失败,因为有明显的问题?

从TDD的角度来看,需要进行两项改进:

  1. 自动测试需要变得更加现实才能重现实际问题。
  2. 如果没有日志记录,则测试需要失败。

本文介绍了如何执行此操作。

背景

如果您以前曾经使用过xUnit,这将非常有帮助,因为测试示例是基于xUnit的。另外,.NET Core的一些经验也很有帮助,因为这是我们在这里使用的技术。

使用代码

出于演示目的,我们使用了一种非常简单的控制器方法。传入的value包含FirstName, MiddleName和LastName以返回全名ActionResult。

[HttpPut]
public ActionResult Put([FromBody] Name value)
{
    _logger.LogWarning("Warning Logged");
    _logger.LogInformation("This is the input {name}", value);
    _logger.LogError(new InvalidDataException("Some exception message"),"Some Exception");

    return Ok($"{value.FirstName} {value.MiddleName} {value.LastName}");
}

对于此方法,我们需要一个可以检测到记录的测试:InvalidDataException,一些记录消息和Name类型的数据对象。此外,测试必须切合实际,这意味着它知道并使用设置依赖项的Startup类。在常规的单元测试中,情况并非如此,但在针对.NET Core的集成测试中,情况从下面显示的代码中可以清楚地看出:

[Fact]
public async Task NoMiddleNamePutTest()
{
    await using (var fixture = new Fixture())
    {
        var controller = fixture.Create();
        var response = controller.Put(new Name()
        {
            FirstName = "F",
            LastName = "L"
        });
        Assert.Equal(200, ((ObjectResult)response.Result).StatusCode);
        Assert.Single(fixture.LogSource.GetWarnings());
        var dataLogged = fixture.LogSource.GetLoggedObjects().ToList();
        Assert.Single(dataLogged);
        Assert.Equal("F", dataLogged.Single().Value.FirstName);
        Assert.Contains(fixture.LogSource.GetLogLines(), a => a == "Warning Logged");
        Assert.Contains(fixture.LogSource.GetLogLines(), a => a.Contains("This is the input"));
        Assert.Single(fixture.LogSource.GetExceptions().OfType());
    }
}

Fixture类是从一个名为IntegrationFixture的公开的NuGet包。它使用WebApplicationFactory类(在此处说明)来减少开发人员要编写的样板代码。在Startup类中设置的真实类依赖关系(不是模拟)用于使测试变得现实。LogSource属性使开发人员能够调用返回我们关注的数据的方法(如记录的数据对象,记录的行和记录的异常)。由于使用了真正的依赖关系,因此生产问题的可能性越来越小,因此这些问题很可能会在测试中涵盖。此外,如果有生产问题,将有足够的日志记录来帮助您解决问题,因为xUnit测试将简单地失败并阻止部署,如果没有足够的日志记录,代码可以在GitHub上 .. 获得。

兴趣点

在编写代码时,我开始意识到自动化测试的重要性。作为开发人员,我们需要编写用于CI的集成测试,而不仅仅是单元测试。此外,我们不仅应该关注所需的功能,还应该关注日志记录。良好的日志记录对于快速解决生产问题至关重要,并且使用上述提到的NuGet软件包,我们可以轻松地检测出已记录的内容。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0525s