标准库错误的Golang覆盖率测试

时间:2018-03-26 18:23:45

标签: unit-testing go error-handling

我一直在努力了解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%的覆盖率,或者我正在做错或构建错误的东西?或者人们会跳过测试这些条件?

2 个答案:

答案 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%的覆盖率