【问题标题】:Running testcases in golang during exception在异常期间在 golang 中运行测试用例
【发布时间】:2014-08-27 23:41:16
【问题描述】:

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

func GetByNameReturnNull(serName string)
{
 //Logic
}

我的测试用例文件是 myTest.go,它有两个参数,一个调用无效输入的方法,一个调用有效输入的方法。

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


func Test2(t *testing.T) { 

    GetByNameReturnNull("valid")
}

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

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

$go test ./... -v

第二个测试用例不会因为第一个异常而执行。

所以在不改变基本方法(GetByNameReturnNull)中的任何逻辑来返回 err 或任何东西的情况下,有没有办法在测试用例文件本身中处理这种情况以打印

1 fail 1 pass in the output?

【问题讨论】:

  • 我们是否应该假设这个GetByNameReturnNull函数不能被修改返回错误?如果它可以创建一个错误,它应该真的返回一个。
  • 我也不想推迟测试用例,它应该按顺序执行测试用例,例如 test1、test2、test3,最后如果任何测试失败,它应该返回 1 pass 2 fail,假设如果所有的测试用例都通过了,输出应该是 3 pass...
  • 抛出异常 ??这不是java。不能轻易测试?代码气味!返回错误。

标签: go


【解决方案1】:

@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
【解决方案2】:

如果您预计您的测试会出现恐慌,您不应该看到“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 退出的函数,则该测试将通过。

【讨论】:

  • 一个观察结果是,如果我有 10 个测试用例要按顺序执行,我一开始不会知道哪个会失败,哪个会通过。通常可以是 8 pass 2 fail/ 10 pass 0 fail / 7 次通过 3 次失败,取决于网络等各种因素。最终,用户应该了解通过和失败的测试用例。
  • @user1907849 然后您可以自定义defer func() 及其recover 以打印失败案例。
  • 但我不知道哪些测试用例会失败,这就是这里的核心问题....有时testcase1可能会失败,其他testcase10可能会失败......如果有时所有测试用例都可以通过......
  • @user1907849 是的,但是您可以在全局变量中记录哪些测试失败(在恢复中)并且哪些通过了。然后你可以在最后打印总数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多