提问人:themagicalyang 提问时间:2/25/2022 最后编辑:themagicalyang 更新时间:2/26/2022 访问量:700
单元测试应该测试多少个方案?
How many scenarios should a unit test test?
问:
假设有一个函数:
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。并将它们聚合在一起。result
data
flat
percent
如果我要写测试,你会怎么做???
我是否必须对每个琐碎的场景进行多次测试?
说什么时候??
TestCalculate/CorrectValue_FlatValueLessThanPercentValuevalue1 < value2
说什么时候??
Test计算/CorrectValue_FlatValueEqualToPercentValuevalue1 > value2
检查是否按数据添加了 flat??所以对于 3 个内容,??
Test计算/CorrectValue_FlatValuePerDataarrayofdata
result = 3*config.flat
所有这些看起来都非常微不足道,可以简单地组合成一个测试。推荐的方式是什么?
比如说一个测试,其中
config { percent: 1, flat: 20}
然后你把每个元素检查上面写的每种情况之一arrayofdata
arrayofdata: {
1, // 1*percent < flat
40, // 40*percent > flat
}
如果我们将值相加,结果将是正确的,因此您已经检查了 . 中多个元素的情况。arrayofdata
这是更好的方法吗?一个测试,但结合细节。 并针对其他情况(如arrayofdata中的零元素等)进行单独测试。
答:
我建议遵循 Martin 的 Clean Code 中的常见做法。其中两个特别讨论的准则是“每个测试一个断言”和“每个测试一个概念”。
当我们断言测试了 1 个以上的场景并且事情开始失败时,可能很难弄清楚哪个部分不再通过。当这种情况发生时,无论如何,您最终都会将该单元测试拆分为三个单独的测试。
不妨从 3 个单独的测试开始,保持测试的简洁和表现力,这样如果你几个月后再回来,你就可以弄清楚什么单元测试在做什么:)
评论