在处理模糊错误时如何保持良好的Go包测试覆盖率?

Cer*_*era 8 testing go

我正试图在我的一些Go包上保持100%的代码覆盖率.这在任何地方都不可行,即使我-integration在构建系统上使用构建标记选择了一些测试,但它应该可以用于我相对孤立的库包.

但是,我无法处理模糊错误路径的覆盖范围.

下面是我的一个方法示例,它是集成测试的一部分,其中有一个真正的文件系统:

func (idx Index) LoadPost(title string) (*PostSpec, string, error) {
    postFolder := strings.Replace(strings.ToLower(title), " ", "_", -1)
    spec, err := idx.getSpec(postFolder)
    if err != nil {
            return nil, "", err
    }
    f, err := os.Open(path.Join(idx.blogdir, postFolder, "content.html"))
    if err != nil {
            return nil, "", err
    }
    defer f.Close()

    b, err := ioutil.ReadAll(f)
    if err != nil {
            return nil, "", err
    }
    return spec, string(b), nil
}
Run Code Online (Sandbox Code Playgroud)

这是它的样子go tool -cover:

去工具封面html输出

击中那个区块并不容易.除了创建一个特殊的测试目录,我试图打开的文件不是常规文件,我想不出任何办法.这似乎很复杂.

这本身并不是太多的交易,但这意味着我必须记住,97.3%报道是正确的数字.如果我看到这个数字下降,是否意味着我已经破坏了我的测试并且现在有更多未覆盖的代码?或者只是我通过简化和删除或死代码设法改进我的包?它导致第二次猜测.

对某些人来说更重要的是,在商业环境中,它是一个很好的构建仪表板的障碍.

Von*_*onC 5

io/ioutil/ioutil_test.go 只是通过使用不存在的文件调用ioutil.ReadFile()函数来测试该错误.

这不应该要求任何设置.

filename := "rumpelstilzchen"

contents, err := ReadFile(filename)
if err == nil {
    t.Fatalf("ReadFile %s: error expected, none found", filename)
}
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,但这只有在我切换到使用 ReadFile 帮助程序后才有效。还有其他使用“ioutil.ReadAll()”的情况 - 它适用于任何“io.Reader” - 我认为问题在于它们很难测试。 (2认同)