正在测试 log.Fatalf?

标签 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 并且 go engine 死掉了。

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

最佳答案

使用 log.Print 而不是 log.Fatal 并返回您在函数 checkIfReadable 的签名中声明的错误值。或者不要出错并将其返回到更了解如何处理它的地方。

log.Fatal 函数严格用于报告程序的最后一口气

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

关于正在测试 log.Fatalf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45797858/

相关文章:

mysql - 如何查找表中相对于初始 SQL fixture 的更改?

java - 构建一个测试,该测试使用在本地主机上运行的基于 Spring 的 REST API URL 进行测试

ruby - 运行 Ruby Selenium 测试用例时出现 "Failed assertion, no message given."错误

testing - QTP - 检查动态页面

json - 如何将JSON解析成数据结构

python - tox和Travis-CI有什么关系和区别?

go - 如何使用 gorm 将记录插入现有的有很多表

go - 无法从字节数组中删除 Null 终止符?

带有 LDAP 的 golang webapp

recursion - 为什么 Go 计算斐波那契递归这么快?