相关疑难解决方法(0)

退出并带有错误代码?

使用一些错误代码退出程序的惯用方法是什么?

Exit说"程序立即终止;延迟函数不运行.",log.Fatal只是调用的文档Exit.对于没有令人发指的错误的事情,在不运行延迟函数的情况下终止程序似乎是极端的.

我是否应该传递一些状态,表明存在错误,然后Exit(1)在某些时候调用我知道我可以安全退出,所有延迟函数都已运行?

error-handling exit go

40
推荐指数
3
解决办法
4万
查看次数

如何测试包含log.Fatal()的Go函数

说,我有以下代码打印一些日志消息.我如何测试是否记录了正确的消息?作为log.Fatal调用os.Exit(1),测试失败.

package main

import (
    "log"
)

func hello() {
    log.Print("Hello!")
}

func goodbye() {
    log.Fatal("Goodbye!")
}

func init() {
    log.SetFlags(0)
}

func main() {
    hello()
    goodbye()
}
Run Code Online (Sandbox Code Playgroud)

以下是假设性测试:

package main

import (
    "bytes"
    "log"
    "testing"
)


func TestHello(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    hello()

    wantMsg := "Hello!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

func TestGoodby(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    goodbye()

    wantMsg := "Goodbye!\n" …
Run Code Online (Sandbox Code Playgroud)

testing go

21
推荐指数
5
解决办法
1万
查看次数

使用覆盖率信息测试Go中的os.Exit场景(coveralls.io/Goveralls)

这个问题:如何测试Go中的os.exit场景(以及其中最高的投票答案),阐述了如何os.Exit()在go中测试场景.由于os.Exit()不能轻易拦截,使用的方法是重新调用二进制文件并检查退出值.这个方法在Andrew Gerrand(Go团队的核心成员之一)的演示文稿第23页中描述; 代码非常简单,下面将全文转载.

相关的测试和主文件看起来像这样(请注意,这对文件本身就是一个MVCE):

package foo

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher() // This causes os.Exit(1) to be called
        return
    }
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        fmt.Printf("Error is %v\n", e)
    return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
Run Code Online (Sandbox Code Playgroud)

package …
Run Code Online (Sandbox Code Playgroud)

architecture testing unit-testing go coveralls

13
推荐指数
2
解决办法
3157
查看次数