我想在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并且引擎死了。
答案 0 :(得分:4)
使用log.Print
代替log.Fatal
并返回您在函数checkIfReadable
的签名中声明的错误值。或者不要将错误归还给某个更了解如何处理错误的地方。
功能log.Fatal
主要用于报告您的计划最终呼吸。
调用log.Fatal
比调用恐慌(还有log.panic
)更糟糕,因为它不执行延迟调用。请记住,在Go中过度使用panic
被认为是一种糟糕的风格。
答案 1 :(得分:0)
获得100%测试覆盖率并且不会同时失败的好方法是使用recover()
来捕捉log.Fatalf()
引发的恐慌。
以下是recover的文档。我认为它很适合你的用例。