【发布时间】:2017-05-14 06:05:47
【问题描述】:
我想对调用 os.File.Write() 并希望 100% 覆盖率的函数进行单元测试。
此函数返回n 和一个错误。引发错误很容易。我只需要关闭文件。我怎样才能诱导没有写入错误和写入数据长度不同的值n?
看起来我应该创建一个虚拟 os.File 来控制返回的错误。不幸的是, os.File 不是一个接口。
编辑:根据 PeterOS 的回答,并在仔细检查文档后,Write() 方法,无论是用于 io.Writer 还是 io.File 将始终返回长度如果err 为零,则写入切片。结果,我的问题似乎毫无意义。我学到了一些重要的东西,谢谢。我有一些代码要清理。
作为旁注,我对 100% 代码覆盖率的追求似乎受到了批评。我将尝试解释实现 100% 覆盖率的理性。我愿意讨论。
我所说的 100% 覆盖意味着 100% 的代码行由单元测试执行。我使用 Go 工具来衡量这一点。
100% 的代码覆盖率显然并不意味着 0% 的错误。如果不正确测试所有可能或关键的用例,很容易获得 100% 的代码覆盖率。
100% 覆盖率度量的危险在于它成为单元测试编写的重点和目标。单元测试的第一个目标,即发现错误,然后被推到后台。
编写单元测试以达到 100% 的覆盖率会增加开发成本,而且这样做并不有趣。我知道。
我看到的 100% 代码覆盖率的唯一好处是可以轻松检测和定位未经测试的代码添加。
收益是否超过成本取决于您的编程方式。我像画家一样编程,根据需要在这里和那里修改和添加代码。我把所有的计划和路线图都记在心里。如果我必须添加或更新测试并检查它们,我会忘记我在做什么。所以我首先对功能进行编码,然后对其进行测试。 100% 的代码覆盖率让我很容易找到需要添加测试的代码添加。这是一个启发式。不是检测所有缺失测试的方法。
结论:不要混淆 100% 的代码覆盖率和 0% 的错误确实很重要。同样重要的是要意识到,以 100% 的代码覆盖率为目标可能会将测试的第一个目标传递给后台,即发现错误。最后,达到 100% 覆盖率的成本必须与其好处相平衡,即轻松检测和定位未经测试的代码,否则会浪费资源。根据您的个人开发方法做出选择。我自己做的。
【问题讨论】:
-
这是个好问题,但
100% coverage既不现实,也没有意义。 -
@Flimzy 我想要 100% 的覆盖率有多个正当理由。这不是重点。
-
@chmike:我知道这不是重点。这就是为什么我说这是一个很好的问题并投了赞成票。但是不,没有任何正当理由想要这样做,因为 100% 的测试覆盖率在逻辑上是不可能的,想要不可能的事情永远不会成立。
-
@Flimzy 正如 PeterOS 所指出的,当 os.File.Write 返回 nil 错误时,n 是切片的长度。所以测试 n 没有意义。我会删除问题。感谢您花时间尝试帮助我。
标签: unit-testing go