我一直在努力了解Go的内置测试框架并获得适当的测试覆盖率。
在我正在测试的其中一个文件中,我只获得了~87%的覆盖率:
coverage: 87.5% of statements
以下是测试中涵盖的代码部分:
// Check that the working directory is set
if *strctFlags.PtrWorkDir == "" {
// if the working directory is empty, set it to the current directory
strTemp, err := os.Getwd()
if err != nil {
return "", errors.New("Could not get current working directory")
}
*strctFlags.PtrWorkDir = strTemp
} else if stat, err := os.Stat(*strctFlags.PtrWorkDir); err != nil ||
!stat.IsDir() {
// Existence check of the work dir
return "", errors.New("Specified directory \"" + *strctFlags.PtrWorkDir + "\" could not be found or was not a directory")
}
*strctFlags.PtrWorkDir, err = filepath.Abs(*strctFlags.PtrWorkDir)
if err != nil {
return "", errors.New("Could not determine absolute filepath: " + err.Error())
}
根据.out文件在测试中未涉及的部分是“if err!= nil {}”块,这将是标准库调用返回的错误。
虽然我认为标准库传递错误的可能性很小,除非出现硬件故障,但我认为最好知道错误是在应用程序中正确处理的。另外,根据我的理解,检查返回的错误是惯用的Go所以我认为能够正确地测试错误处理会很好。
人们如何处理上述情况下的测试错误?是否有可能获得100%的覆盖率,或者我正在做错或构建错误的东西?或者人们会跳过测试这些条件?
答案 0 :(得分:4)
有许多非硬件故障情况,大多数标准库函数可能会失败。你是否愿意测试这些是另一个问题。例如,对于os.Getwd()
,如果工作目录不存在,我可能希望调用失败(并且您可以尝试测试此方案)。
可能更有用(以及更好的测试方法)是模拟这些调用,以便您可以在测试期间触发错误,以便您可以测试错误案例代码。 / p>
但是,为了爱代码,请不要瞄准100%的测试覆盖率。瞄准有用的测试覆盖率。可以在不覆盖有用情况的情况下使工具报告100%覆盖,并且可以在不将工具报告100%的情况下覆盖有用情况。
但 true 100%覆盖率在大多数程序中都是不可能的(即使是简单的" Hello World!")。所以不要瞄准它。
答案 1 :(得分:2)
正如@flimzy在上面解释的那样,以100%的覆盖率为目标并不是为了有用的测试覆盖率。
虽然您可以通过稍微修改代码来测试系统调用,例如
package foo
// Get Working directory function
var osGetWd = os.Getwd
func GetWorkingDirectory() (string,error){
strTemp, err := osGetWd() // Using the function defined above
if err != nil {
return "", errors.New("Could not get current working directory")
return strTemp,nil
}
在测试时
package foo
func TestGetWdError() {
// Mocked function for os.Getwd
myGetWd := func() (string,error) {
myErr := errors.New("Simulated error")
return "",myErr
}
// Update the var to this mocked function
osGetWd = myGetWd
// This will return error
val,err := GetWorkingDirectory()
}
这将帮助您实现100%的覆盖率