当你在单元测试带有 error
返回类型的函数时,我想知道如何正确地对此错误进行单元测试。你应该只检查错误是否为 nil 还是非 nil?或者你应该验证错误字符串与期望字符串匹配吗?
当你在单元测试带有 error
返回类型的函数时,我想知道如何正确地对此错误进行单元测试。你应该只检查错误是否为 nil 还是非 nil?或者你应该验证错误字符串与期望字符串匹配吗?
在大多数情况下,您只需检查错误是否为nil。
我建议仅在绝对必要时检查错误字符串。一般来说,我认为错误字符串仅供人类阅读。
如果您需要更多关于错误的详细信息,一个更好的替代方案是使用自定义错误类型。然后,您可以在err.(type)上进行switch并查看它是否是您期望的类型。 如果您需要更多详细信息,您可以使自定义错误类型包含值,然后在测试中进行检查。
Go的错误只是具有Error() string
方法的类型的接口,因此自己实现它们很简单。
https://blog.golang.org/error-handling-and-go
这里有一个很实用的testify包。
根据文档所说:"EqualErrorf断言一个函数返回了一个错误(即不是nil
),并且它与提供的错误相等。"
assert.EqualErrorf(t, err, expectedErrorMsg, "Error should be: %v, got: %v", expectedErrorMsg, err)
assert.Containsf(t, err.Error(), tt.wantErrMsg, "expected error containing %q, got %s", tt.wantErrMsg, err)
*testing.T
,而err
的类型是error
。err!= nil
会隐藏此问题。 - Ed Harrod我经常使用这个简单的函数来检查错误:
// ErrorContains checks if the error message in out contains the text in
// want.
//
// This is safe when out is nil. Use an empty string for want if you want to
// test that err is nil.
func ErrorContains(out error, want string) bool {
if out == nil {
return want == ""
}
if want == "" {
return false
}
return strings.Contains(out.Error(), want)
}
示例用法:
if !ErrorContains(err, "unexpected banana") {
t.Errorf("unexpected error: %v", err)
}
if !ErrorContains(err, "") {
t.Errorf("unexpected error: %v", err)
}
我发现在基于表格的测试中,这样做尤其有用:
tests := struct{
want string
wantErr string
}{
{
"some output",
"", // No error expected
},
{
"",
"out of coconuts",
}
}
它避免了与 "nil"、"errors.New()" 等打交道的麻烦。我测试了返回错误并检查错误消息是否匹配的函数。但是是否检查错误仅为你决定,只需检查错误不是nil
。
假设您有这样一个函数:
func returnSomeErr(input int)error{
if input > 0{
return nil
}
return errors.New("this is error message")
}
// testing tot get error message
func TestReturnSomeErr(t *testing.T){
Expected := "this is error message"
actual := returnSomeErr(-1)
if actual.Error() != Expected{
t.Errorf("Error actual = %v, and Expected = %v.", actual, test.Expected)
}
}
请注意,我正在使用.Error()
函数来获取错误消息,以便将其与字符串进行比较。您可以创建另一个测试以测试输入数据> 0
时是否没有错误。