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

标签 unit-testing code-coverage

我创建了一个 app , 做了一些 unit tests并接近 100% code coverage .

在不同条件、配置等下测试应用程序时。应用程序不止一次失败,因此我创建/增加了当前测试以涵盖这些可能性,但可能我仍然遗漏了一些情况,即 100% 的覆盖率不会不透露。

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

最佳答案

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

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

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

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

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

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

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

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

关于unit-testing - 100% 的代码覆盖率并没有涵盖我所有的真实案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35394641/

相关文章:

ios - 我们如何为 iOS 手动测试生成 (profdata) 代码覆盖率?

c# - 使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?

java - 一个方法在 JUnit 中生成了预期的结果,但它说它是 null

c# - 在这种情况下,我应该对所有可能的输入进行单元测试吗?

visual-studio - 在 Visual Studio 中使用属性从覆盖率分析中省略代码

go - golang安装覆盖包时出现的问题

unit-testing - 使用 $rootScope 和 $httpBackend 进行 Angularjs 单元测试

javascript - 将测试中的日期与 Jasmine 进行比较时出错

unit-testing - 单元测试覆盖率实际上是如何完成的?

.net-core - 未为 dotnet 核心项目生成 Coverlet lcov.info 文件