100% 代码覆盖率的悲剧

2025-06-08

100% 代码覆盖率的悲剧

本文最初发表于IG 博客

事情的反转真是有趣。十五年来,我一直在宣扬TDD,或者至少建议开发人员编写一些单元测试。然而,最近我发现自己越来越多地问自己:“你为什么要写那个测试?”,而不是“你应该写一个测试”。

到底是怎么回事?

我在办公室里走动时,一位开发人员请我帮他做一些单元测试。他似乎在使用 Mockito 测试以下代码时遇到了麻烦:

模拟

我想他对我的回答感到非常惊讶:“你不需要测试这个。”

“但我必须这么做!”他说,“那我怎么知道密码能不能用呢?!”

“代码很明显。没有条件,没有循环,没有转换,什么都没有。这段代码只是一些普通的胶水代码。”

“但是如果没有测试,任何人都可以来修改并破解密码!”

“你看,如果那个想象中的邪恶/无知的开发人员出现并破坏了那段简单的代码,你认为如果相关的单元测试失败他会怎么做?他只会删除它。”

“但如果你必须参加考试怎么办?”

“既然如此,我会这样测试:”

无模拟

“但是你没有使用 Mockito!”

“那又怎样?Mockito 帮不了你。恰恰相反,它只会妨碍你,不会让测试更易读或更简单。”

“但我们决定使用 Mockito 进行所有测试!”

我: ”…”

下次我碰到他时,他自豪地说他已经用 Mockito 写好了测试。我能理解测试成功后的那种满足感,但即便如此,我还是感到难过。

另一个例子

一位开发人员把我拉了进来,他对自己新应用的高代码覆盖率以及对BDD的新热爱感到非常兴奋。查看代码后,我们发现了以下Cucumber测试:

黄瓜

如果您以前使用过 Cucumber,那么您不会对它所需的支持代码的数量感到惊讶:

支持黄瓜
支持黄瓜2

所有这些都需要测试:

黄瓜汁

是的,简单的地图查找。

我对开发人员有足够的信任,可以直截了当地说:“这太浪费时间了。”

“但是我的老板希望我为所有课程参加考试,”他回答道。

“以……为代价?”

“费用?”

“无论如何,这些测试与 BDD 无关。”

“我知道,但我们决定在所有测试中使用 Cucumber”

我: ”…”

我理解将工具按照自己的意愿使用所带来的精神满足,但尽管如此,它还是让我感到难过。

悲剧在哪里?

悲剧的是,两个聪明的开发人员(我都会带他们去团队面试)却在浪费时间编写这些毫无意义的测试,而这些测试需要由未来几代 IG 开发人员来维护。

悲剧的是,我们没有使用正确的工具来完成工作,而是决定继续使用错误的工具,没有任何特别好的理由。

悲剧的是,一旦一种“好的做法”成为主流,我们似乎就会忘记它是如何产生的,它的好处是什么,最重要的是,使用它的成本是多少。

相反,我们只是机械地套用,没有经过太多思考,这通常意味着我们最终得到的充其量只是平庸的结果,失去了大部分好处,却付出了全部(甚至更多)的代价。以我的经验来看,编写好的单元测试是一项艰苦的工作

那么 100% 的代码覆盖率值得追求吗?

是的,每个人都应该在一个项目中实现它。我认为,你必须竭尽全力才能知道极限在哪里。

我们已经对一个极端的情况积累了丰富的经验:零单元测试的项目,所以我们深知处理这类项目的痛苦。我们通常缺乏的是另一个极端的情况:强制执行 100% 代码覆盖率且所有代码都采用 TDD 开发的项目。

单元测试(尤其是测试优先方法)是一种非常好的实践,但我们应该了解哪些测试是有用的,哪些测试是适得其反的。

但请记住,没有什么是免费的,没有什么是灵丹妙药。停下来思考一下。

鏂囩珷鏉ユ簮锛�https://dev.to/danlebrero/the-tragedy-of-100-code-coverage
PREV
学习编码(免费)
NEXT
专业软件开发的一年