对不同的结果进行单元测试是不是很糟糕?

时间:2018-01-10 11:32:43

标签: c# unit-testing xunit

与同事讨论以下问题:

[Theory(DisplayName = "Notify if success only")]
[InlineData(false)]
[InlineData(true)]
public async Task IngestAsync(bool isSuccess)
{
    if (!isSuccess)
    {
        _transfererMock.Setup(t => t.TransferAsync(It.IsAny<Ingest>(), It.IsAny<CancellationToken>()))
            .ReturnsAsync(Result.Fail("testError"));
    }

    var res = await _ingester.IngestAsync(new Ingest());

    Assert.Equal(res.IsSuccess, isSuccess);

    if (isSuccess)
    {
        _ingestNotifierMock.Verify(inn => inn.Notify(It.IsAny<string>(), It.IsAny<bool>()), Times.Once);
    }
    else
    {
        _ingestNotifierMock.Verify(inn => inn.Notify(It.IsAny<string>(), It.IsAny<bool>()), Times.Never);
    }
}

测试不同结果的结果是不好的做法还是这样好?

1 个答案:

答案 0 :(得分:1)

这里有一个平衡,就是如何&#34;不同&#34;不同的结果是。

最简单的是,如果我们有一个简单的添加方法,那么我们当然希望知道给定23作为输入它产生5,给出-29生成了7,依此类推。我们希望在广泛的值上测试它,特别注意那些可能存在于实际代码中的值,边缘情况(溢出边界上的那些)和过去导致错误的情况。 / p>

这些是严格的&#34;不同的结果&#34;,但它们都是相同的基本想法,所以它们只是勉强&#34;不同&#34;。

现在,如果这是一个经过检查的添加,则会为输入int.MaxValue49抛出异常。这是一个更加不同的&#34;不同的结果。

如果是否检查是否依赖于某个初始状态,则该先前案例的结果将根据该状态而不同。这是一个更加不同的&#34;类型&#34;不同的结果&#34;。

在某些时候,它几乎成了另一种被测试的东西,因此几乎肯定会有不同的测试。

我们最终无法说出超过&#34;主要是基于意见的&#34;正是这一点。

就个人而言,通过上面给出的例子,我肯定会考虑第一种情况(简单的加法给出输入的总和)作为对可能值范围的相同测试。我可能会将影响结果的不同初始状态视为单独的测试。我不确定我是否将中间情况(某些结果导致溢出异常)视为单独或相同,实际上在为System.Linq.Expressions编写测试时,我已经考虑了两种方式的类似测试,主要是在看似更方便的基础。对我来说,这个案例是如此坚定地在#34;主要以意见为基础的阵营中。我自己甚至对此都没有一致意见。

您的示例看起来像我认真考虑的那种情况&#34;不同&#34; a&#34;不同的结果&#34;有一个单独的测试,但如果我对被测试的代码有更多的了解,我可能会想到。

简而言之,是的,对于显着不同的结果进行不同的测试是一种很好的做法,但是它们之间的差异有多大差异?#34;通常情况下,人们可以合理地有不同的意见。