我想从测试包中包装标准的golang测试函数,例如t.Errorf
。
我试过了:
// AssertEqual tests that the expected and actual values match
func AssertEqual(t *testing.T, expected interface{}, actual interface{}) {
switch expected.(type) {
case string:
if expected != actual {
t.Errorf("Error:\nexpected: %s\nactual: %s", expected, actual)
}
default:
t.Errorf("Unsupported type")
}
}
但是,当测试失败时,我会得到我的辅助函数的函数和行号:
test_asserts.go:12: Error:
expected:
actual: TestValue
调用者的行号有没有办法出错?
答案 0 :(得分:2)
测试库就是这样做的: https://golang.org/src/testing/testing.go?h=Errorf#L285
使用runtime.Caller
。
您可以借用此代码来处理您自己的错误函数,该函数会更深入地查看堆栈。您可以替换整个Errorf
(log
+ fail
)或稍微不那么漂亮,但只需使用类似debug.PrintStack()
之类的内容打印整个堆栈的代码就越少在致电Errorf
之前。
答案 1 :(得分:1)
您可以在Fail
包中找到assert
功能:https://github.com/stretchr/testify/blob/master/assert/assertions.go#L207
示例:
package main_test
import (
"fmt"
"github.com/stretchr/testify/assert"
"strings"
"testing"
)
// AssertEqual tests that the expected and actual values match
func AssertEqual(t *testing.T, expected interface{}, actual interface{}) {
switch expected.(type) {
case string:
if expected != actual {
callInfo := assert.CallerInfo()
errorTrace := strings.Join(callInfo, "\n\r\t\t\t")
t.Errorf("\r%s\r\tError Trace:\t%s\n"+
"\r\tError:%s\n\r",
"",
errorTrace,
fmt.Sprintf("Error:\nexpected: %s\nactual: %s", expected, actual),
)
}
default:
t.Errorf("Unsupported type")
}
}
func TestFoo(t *testing.T) {
AssertEqual(t, "hello", 21)
}
结果:
$ go test main_test.go
--- FAIL: TestFoo (0.00s)
Error Trace::22:main_test.go:15
main_test.go:30
Error:Error:
expected: hello
actual: %!s(int=21)
FAIL
FAIL command-line-arguments 0.002s
答案 2 :(得分:1)
使用最近的Go 1.9(2017年8月),您需要做的就是为您的功能添加一行:
t.Helper()
这将使错误报告中的此函数静音,并且您的实际错误行将是您期望的那个(即调用此函数的那个)
请参阅pkg/testing/#T.Helper
(也适用于Benchmark test,但......不适用于TB
interface,其中it was forgotten!)
// AssertEqual tests that the expected and actual values match
func AssertEqual(t *testing.T, expected interface{}, actual interface{}) {
t.Helper()
switch expected.(type) {
case string:
if expected != actual {
t.Errorf("Error:\nexpected: %s\nactual: %s", expected, actual)
}
default:
t.Errorf("Unsupported type")
}
}