标准库错误的覆盖率测试

Bar*_*rim 2 error-handling unit-testing go

我一直在尝试了解 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())
}
Run Code Online (Sandbox Code Playgroud)

根据 .out 文件,测试中未涵盖的部分是“if err != nil {}”块,这将是从标准库调用返回的错误。

虽然我认为除非出现硬件故障,否则标准库传递错误的可能性很小,但我认为知道错误在应用程序中得到正确处理会很好。此外,根据我的理解,检查返回的错误是惯用的 Go,所以我认为能够正确测试错误处理会很好。

人们如何处理上述情况的测试错误?是否有可能获得 100% 的覆盖率,或者我是否在做或构造错误的东西?或者人们是否跳过测试这些条件?

She*_*tyh 5

正如@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
}
Run Code Online (Sandbox Code Playgroud)

并且在测试时

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

这将帮助您实现 100% 的覆盖率