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

时间:2014-07-08 09:08:20

标签: 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
}

以下是go tool -cover中的内容:

go tool cover html output

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

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

对某些人而言,更重要的是,在商业环境中,这是一个很好的构建仪表板的障碍。

1 个答案:

答案 0 :(得分: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)
}