我想在 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/