测试log.Fatalf in go?

时间:2017-08-21 13:03:01

标签: testing go

我想在go代码中实现100%的测试覆盖率。我无法涵盖以下示例 - 任何人都可以帮助我吗?

package example

import (
    "io/ioutil"
    "log"
)

func checkIfReadable(filename string) (string, error) {
    _, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Fatalf("Cannot read the file... how to add coverage test for this line ?!?")
    }
    return "", nil
}

func main() {
    checkIfReadable("dummy.txt")
}

对此有些愚蠢的考验:

package example

import (
    "fmt"
    "testing"
)

func TestCheckIfReadable(t *testing.T) {
    someResult, err := checkIfReadable("dummy.txt")
    if len(someResult) > 0 {
        fmt.Println("this will not print")
        t.Fail()
    }
    if err != nil {
        fmt.Println("this will not print")
        t.Fail()
    }
}

func TestMain(t *testing.T) {
...
}

问题是log.Fatalf调用os.Exit并且引擎死了。

  • 我可以修改代码并用自己的代码替换内置库 - 这使得测试不太可靠。
  • 我可以修改代码并创建一个代理和一个包装器和....换句话说,非常复杂的机制来更改所有调用“log.Fatalf”
  • 我可以停止使用内置日志包了......等于问“内置多少价值?”
  • 我可以忍受没有100%的覆盖率
  • 我可以用其他东西替换“log.Fataf” - 但是内置log.Fatalf有什么意义呢?
  • 我可以尝试使用系统内存进行修改,并根据我的操作系统替换函数的内存地址(...),以便做一些模糊和肮脏的事情
  • 还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

使用log.Print代替log.Fatal并返回您在函数checkIfReadable的签名中声明的错误值。或者不要将错误归还给某个更了解如何处理错误的地方。

功能log.Fatal主要用于报告您的计划最终呼吸

调用log.Fatal比调用恐慌(还有log.panic)更糟糕,因为它不执行延迟调用。请记住,在Go中过度使用panic被认为是一种糟糕的风格。

答案 1 :(得分:0)

获得100%测试覆盖率并且不会同时失败的好方法是使用recover()来捕捉log.Fatalf()引发的恐慌。

以下是recover的文档。我认为它很适合你的用例。