如何包装golang测试函数

时间:2016-08-28 19:05:02

标签: go

我想从测试包中包装标准的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

调用者的行号有没有办法出错?

3 个答案:

答案 0 :(得分:2)

测试库就是这样做的: https://golang.org/src/testing/testing.go?h=Errorf#L285

使用runtime.Caller

您可以借用此代码来处理您自己的错误函数,该函数会更深入地查看堆栈。您可以替换整个Errorflog + 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")
    }
}