登录
首页 >  Golang >  Go问答

如何在Go中测试非零退出代码而不中止测试用例

来源:stackoverflow

时间:2024-02-18 10:39:22 318浏览 收藏

今天golang学习网给大家带来了《如何在Go中测试非零退出代码而不中止测试用例》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我正在尝试在 go 中为返回非零退出代码的函数编写单元测试。我正在使用 cobra 开发一个 cli 应用程序来验证语义版本。如果验证失败,我会返回 json 中的一些信息并使用 os.exit(1) 退出。

现在我想测试一下这是否真的按预期工作。在我的测试中,我通过了一组应该成功并返回 0 的数据集和一组应该失败并返回 1 的数据集。但是应该返回 1 的测试总是取消测试,从而取消所有后续迭代。这是我的代码:

func Test_ShouldGetCorrectExitCode(t *testing.T) {
    testCases := []struct {
        args          []string
        shouldBeValid bool
    }{
        {[]string{"0.1.0"}, false},
        {[]string{"v0.1.0"}, true},
    }
    for _, tc := range testCases {
        assert := assert.New(t)

        cmd := NewCmdValidate()
        cmd.SetArgs(tc.args)
        err := cmd.Execute()

        assert.Nil(err)
    }
}

到目前为止,断言还不是很复杂,因为我没有让测试按照我期望的方式运行。有人知道如何在 go 中测试退出代码吗?


正确答案


最好的解决方案是从被测函数中调用 os.exit。一个好的做法是仅从 main() 调用 os.exit,而让您的函数返回退出状态,您可以轻松测试该退出状态。示例:

func main() {
    os.exit(run())
}

func run() int {
  /* things to test here */
}

然后在您的测试中:

func TestRun(t *testing.T) {
    t.Run("should succeed", func(t *testing.T) {
        status := run()
        if status != 0 {
            t.Errorf("Unexpected exit status: %d", status)
    })
    t.Run("should fail", func(t *testing.T) {
        status := run()
        if status != 1 {
            t.Errorf("Unexpected status code: %d", status)
        }
    })
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在Go中测试非零退出代码而不中止测试用例》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>