在异常期间在golang中运行测试用例

时间:2014-08-27 10:14:46

标签: go

我正在为没有返回任何值的方法编写测试用例,例如:

func GetByNameReturnNull(serName string)
{
 //Logic
}

我的testcasefile是myTest.go,它有两个参数,一个用无效输入调用方法,用有效输入调用方法。

func Test1(t *testing.T) { 
    GetByNameReturnNull("Invalid")
}


func Test2(t *testing.T) { 

    GetByNameReturnNull("valid")
}

因此,第一个测试用例将失败并抛出异常,我无法以常规方式处理它,如

"检查返回方法的错误,因为该方法根本不返回任何内容。 当我执行命令时,

$go test ./... -v

第二个测试用例将不会执行,因为第一个测试用例除外。

因此,如果不更改基本方法中的任何逻辑(GetByNameReturnNull)以返回错误或任何内容,是否有任何方法可以在测试用例文件本身中处理此方案以进行打印

1 fail 1 pass in the output?

2 个答案:

答案 0 :(得分:4)

@VonC是正确的,没有办法自动处理它,但是你可以简单地创建一个包装器并在每次测试中调用它。

这样您就不必使用全局变量来跟踪测试。

示例:

func logPanic(t *testing.T, f func()) {
    defer func() {
        if err := recover(); err != nil {
            t.Errorf("paniced: %v", err)
        }
    }()
    f()
}

func Test1(t *testing.T) {
    logPanic(t, func() {
        GetByNameReturnNull("invalid")
    })
    //or if the function doesn't take arguments
    //logPanic(t, GetByNameReturnNull)
}

func Test2(t *testing.T) {
    logPanic(t, func() {
        GetByNameReturnNull("valid")
    })
}

答案 1 :(得分:3)

如果您希望测试出现恐慌,则不应该看到“1失败” 你应该看到两个测试都成功了。

相反,您应该专门测试恐慌情况,例如,在“Understanding Defer, Panic and Recover ”中所述:

func TestPanic(t *testing.T) error {
    defer func() {
        fmt.Println("Start Panic Defer")
        if r := recover(); r != nil {
            fmt.Println("Defer Panic:", r)
        } else {
            t.Error("Should have panicked!")
        }
    }()

    fmt.Println("Start Test")
    panic("Mimic Panic")
}

如果您调用以panic退出的函数,则该测试将通过。