代码之家  ›  专栏  ›  技术社区  ›  Bart Silverstrim

标准库错误的覆盖率测试

  •  2
  • Bart Silverstrim  · 技术社区  · 7 年前

    我一直在努力学习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 回复  |  直到 4 年前
        1
  •  5
  •   Jonathan Hall    4 年前

    正如@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%覆盖

        2
  •  4
  •   Jonathan Hall    6 年前

    有许多非硬件故障情况下,大多数标准库functoid可能会失败。你是否愿意测试这些是另一个问题。对于 os.Getwd() 例如,如果工作目录不存在,我可能会认为调用会失败(您可以尝试测试此场景)。

    更有用的(通常是更好的测试方法)可能是模拟这些调用,以便在测试期间触发错误,只是为了测试错误案例代码。

    但是,出于对代码的热爱,请不要追求100%的测试覆盖率。瞄准 有用的测试覆盖率 。可以在不覆盖有用案例的情况下使工具报告100%覆盖,也可以在不使工具报告100%覆盖有用案例的情况下使工具报告100%覆盖。

    但是 真的 在大多数程序中,百分之百的覆盖率是不可能的(即使是简单的“Hello World!”)。所以不要瞄准它。