与同事讨论以下问题:
[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);
}
}
测试不同结果的结果是不好的做法还是这样好?
答案 0 :(得分:1)
这里有一个平衡,就是如何&#34;不同&#34;不同的结果是。
最简单的是,如果我们有一个简单的添加方法,那么我们当然希望知道给定2
和3
作为输入它产生5
,给出-2
和9
生成了7
,依此类推。我们希望在广泛的值上测试它,特别注意那些可能存在于实际代码中的值,边缘情况(溢出边界上的那些)和过去导致错误的情况。 / p>
这些是严格的&#34;不同的结果&#34;,但它们都是相同的基本想法,所以它们只是勉强&#34;不同&#34;。
现在,如果这是一个经过检查的添加,则会为输入int.MaxValue
和49
抛出异常。这是一个更加不同的&#34;不同的结果。
如果是否检查是否依赖于某个初始状态,则该先前案例的结果将根据该状态而不同。这是一个更加不同的&#34;类型&#34;不同的结果&#34;。
在某些时候,它几乎成了另一种被测试的东西,因此几乎肯定会有不同的测试。
我们最终无法说出超过&#34;主要是基于意见的&#34;正是这一点。
就个人而言,通过上面给出的例子,我肯定会考虑第一种情况(简单的加法给出输入的总和)作为对可能值范围的相同测试。我可能会将影响结果的不同初始状态视为单独的测试。我不确定我是否将中间情况(某些结果导致溢出异常)视为单独或相同,实际上在为System.Linq.Expressions编写测试时,我已经考虑了两种方式的类似测试,主要是在看似更方便的基础。对我来说,这个案例是如此坚定地在#34;主要以意见为基础的阵营中。我自己甚至对此都没有一致意见。
您的示例看起来像我认真考虑的那种情况&#34;不同&#34; a&#34;不同的结果&#34;有一个单独的测试,但如果我对被测试的代码有更多的了解,我可能会想到。
简而言之,是的,对于显着不同的结果进行不同的测试是一种很好的做法,但是它们之间的差异有多大差异?#34;通常情况下,人们可以合理地有不同的意见。