单元测试应该测试多少个方案?

How many scenarios should a unit test test?

提问人:themagicalyang 提问时间:2/25/2022 最后编辑:themagicalyang 更新时间:2/26/2022 访问量:700

问:

假设有一个函数:

type config struct {
    percent float64
    flat    float64
}

func Calculate(c *config, arrayofdata *arrayofdata) float64 {
    result := 0.0
    for _, data := range arrayofdata {
        value1 = data * percent
        value2 = flat
        result += math.Min(value1, value2)
    }
    return result
}

这个简单的计算函数只是根据值或较低者计算 per。并将它们聚合在一起。resultdataflatpercent

如果我要写测试,你会怎么做???

我是否必须对每个琐碎的场景进行多次测试?

说什么时候?? TestCalculate/CorrectValue_FlatValueLessThanPercentValuevalue1 < value2

说什么时候?? Test计算/CorrectValue_FlatValueEqualToPercentValuevalue1 > value2

检查是否按数据添加了 flat??所以对于 3 个内容,?? Test计算/CorrectValue_FlatValuePerDataarrayofdataresult = 3*config.flat

所有这些看起来都非常微不足道,可以简单地组合成一个测试。推荐的方式是什么?

比如说一个测试,其中

config { percent: 1, flat: 20}

然后你把每个元素检查上面写的每种情况之一arrayofdata

arrayofdata: {
    1, // 1*percent < flat
    40, // 40*percent > flat
}

如果我们将值相加,结果将是正确的,因此您已经检查了 . 中多个元素的情况。arrayofdata

这是更好的方法吗?一个测试,但结合细节。 并针对其他情况(如arrayofdata中的零元素等)进行单独测试。

单元测试 Go 测试 与语言无关

评论

0赞 erik258 2/25/2022
dave.cheney.net/2019/05/07/prefer-table-driven-tests我通常以这种方式编写测试用例,并在自己的测试下运行每个用例,这是由于本文在结尾处谈到的原因

答:

0赞 DPGraham4401 2/26/2022 #1

我建议遵循 Martin 的 Clean Code 中的常见做法。其中两个特别讨论的准则是“每个测试一个断言”和“每个测试一个概念”。

当我们断言测试了 1 个以上的场景并且事情开始失败时,可能很难弄清楚哪个部分不再通过。当这种情况发生时,无论如何,您最终都会将该单元测试拆分为三个单独的测试。

不妨从 3 个单独的测试开始,保持测试的简洁和表现力,这样如果你几个月后再回来,你就可以弄清楚什么单元测试在做什么:)