我想先写测试,再写让测试通过的代码。
我可以这样写测试函数:
func TestCheckPassword(t *testing.T) {
isCorrect := CheckPasswordHash("test", "$2a$14$rz.gZgh9CHhXQEfLfuSeRuRrR5uraTqLChRW7/Il62KNOQI9vjO2S")
if isCorrect != true {
t.Errorf("Password is wrong")
}
}
但我想为每个测试函数提供更多描述性信息。
例如,我正在考虑为我的应用程序创建身份验证模块。 现在,用简单的英语,我可以很容易地描述我对这个模块的要求:
- 它应该接受一个非空字符串作为输入。
- 字符串的长度必须介于 6 到 48 个字符之间。
- 如果密码字符串适合提供的哈希字符串,函数应返回 true,否则返回 false。
这些非技术业务人员可以理解的信息,除了放在评论中,还有什么方法可以放在测试中?
最佳答案
在 Go 中,编写测试以执行相关检查的一种常见方法是创建一片测试用例(称为 “表”,方法称为 “表”驱动测试”),我们简单地循环并逐一执行。
测试用例可能具有任意属性,通常由匿名结构建模。
如果您想为测试用例提供描述,您可以在描述测试用例的结构中添加一个附加字段。这将作为测试用例的文档和(部分)输出,以防测试用例失败。
为简单起见,让我们测试以下简单的 Abs()
功能:
func Abs(x int) int {
if x < 0 {
return -x
}
return x
}
实现似乎是正确和完整的。如果我们想为此编写测试,通常我们会添加 2 个测试用例来覆盖 2 个可能的分支:test when x
是负数(x < 0
),而当x
是非负的。实际上,它通常很方便,建议也测试特殊的 0
输入和极端情况:输入的最小值和最大值。
如果我们仔细想想,这个Abs()
当以 int32
的最小值调用时,函数甚至不会给出正确的结果。 ,因为那是 -2147483648
,其绝对值为2147483648
这不适合 int32
因为 int32
的最大值是:2147483647
.所以上面的实现将溢出并错误地将负最小值作为负最小值的绝对值。
列出每个可能分支的案例的测试函数包括0
和角落案例,带有描述:
func TestAbs(t *testing.T) {
cases := []struct {
desc string // Description of the test case
x int32 // Input value
exp int32 // Expected output value
}{
{
desc: "Abs of positive numbers is the same",
x: 1,
exp: 1,
},
{
desc: "Abs of 0 is 0",
x: 0,
exp: 0,
},
{
desc: "Abs of negative numbers is -x",
x: -1,
exp: 1,
},
{
desc: "Corner case testing MaxInt32",
x: math.MaxInt32,
exp: math.MaxInt32,
},
{
desc: "Corner case testing MinInt32, which overflows",
x: math.MinInt32,
exp: math.MinInt32,
},
}
for _, c := range cases {
got := Abs(c.x)
if got != c.exp {
t.Errorf("Expected: %d, got: %d, test case: %s", c.exp, got, c.desc)
}
}
}
关于testing - 如何使用标准的 Go 测试包实现 BDD 实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48882966/