测试log.Fatalf进入吗?

Mac*_*uła -1 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")
}
Run Code Online (Sandbox Code Playgroud)

一些傻瓜测试:

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) {
...
}
Run Code Online (Sandbox Code Playgroud)

问题是log.Fatalf调用os.Exit并退出引擎。

  • 我可以修改代码并用自己的库替换内置库-这会使测试的可靠性降低。
  • 我可以修改代码并创建一个代理,一个包装器和一个....换句话说,非常复杂的机制将所有调用更改为“ log.Fatalf”
  • 我可以停止使用内置日志包...等于问“内置价值多少?”。
  • 我可以忍受没有100%的覆盖率
  • 我可以用其他东西代替“ log.Fataf”-但是内置的log.Fatalf有什么意义呢?
  • 我可以尝试处理系统内存,并根据我的操作系统替换该功能的内存地址(...),因此请进行一些晦涩难懂的操作
  • 还有其他想法吗?

Grz*_*Żur 5

使用log.Print代替log.Fatal并返回您在function的签名中声明的错误值checkIfReadable。或者不要将其错误,然后将其返回到更了解如何处理它的地方。

该功能log.Fatal严格用于报告程序的最终呼吸

调用log.Fatal比调用panic(还有log.panic)要差一些,因为它不会执行延迟的调用。请记住,panic在Go 中过度使用被认为是不好的风格。