100% 的代码覆盖率并没有涵盖我所有的真实案例

100% code coverage didn't cover all my real cases

我创建了一个 app, did some unit tests and got close to the 100% code coverage

在不同条件、配置等下测试应用程序时。应用程序不止一次失败,因此我 created/increased 当前测试涵盖了这些可能性,但可能我仍然遗漏了一些情况,即 100覆盖率百分比不显示。

因此,我想知道是否有一种方法或技术可以补充或帮助覆盖所有可能的 permutations/cases 并基于此创建更好的单元测试和代码覆盖率。

增加代码覆盖率可以增加您对代码正确性的信心,但即使测试覆盖了所有代码路径,覆盖所有可能的输入通常也是不切实际的 也是。以这个方法为例:

public static int divide(int numerator, int denominator) {
    return numerator / denominator;
}

您可以轻而易举地编写一个覆盖该方法 100% 行的单元测试:

@Test
public void testDivide() {
    assertEquals(2, MathHelper.divide(4, 2));
}

但是在分母 = 0 的情况下,您仍然会出现被零除的错误。

您能做的最好的事情就是尝试尽可能多地考虑有趣的边缘案例输入,并围绕它们编写测试。当你确实遇到新输入的错误时,修复错误并编写新测试(就像你所做的那样)以防止回归。

考虑库可能出什么问题通常也很有帮助 and/or 代码的外部依赖项,它们有许多自己的代码路径,这些路径不会出现在仅衡量您的代码库的代码覆盖率指标中。当数据库不可用时会发生什么?网络不可用?磁盘已满?等等

有关如何更好地思考有趣的边缘情况的一些有用提示,请参阅此 Quora question

100% 的代码覆盖率证明您的所有代码都在单元测试中执行。这并不意味着事情不会出错。

它也不能证明你有好的代码。例如,如果您使用 class 来访问一个文件,您可以模拟和测试所有预期的场景,但好的做法是仍然有一些东西来捕获在意外场景中抛出的任何异常——这会创建不可测试的代码块,您如何测试意外情况?

虽然不是坏事,但在我看来,更现实的覆盖率约为 80%,但基于多个场景的测试会产生更好的质量。

就我个人而言,单元测试既是关于锁定功能,也是为了证明它可以工作。我宁愿有 50 个测试重叠相同的核心代码,也不愿用后备存储证明每个 属性。

不幸的是,除了勤奋和称职的开发之外,我不知道有任何补充技术或指标。