在软件开发中,许多开发和测试工程师认为只要通过 JaCoCo 实现了 100% 的代码覆盖率,软件就会没有缺陷,可以高枕无忧。但这种想法其实是一个误解。本文将通过实际的代码示例,揭示即使 JaCoCo 达到 100% 的代码覆盖率,系统仍然可能存在严重缺陷的原因。

故事一

假设你正在开发一款健康风险评估应用,该应用的核心功能包含两个分支,每个分支根据不同的健康因子采用不同的计算逻辑。现在,测试工程师设计了两个测试用例,分别针对年龄为 54 岁和 41 岁的情况。测试完成后,JaCoCo 显示代码覆盖率达到了 100%。然而,尽管两个测试用例的代码都被执行,但其中一个用例通过,另一个却未通过。

public static int calculateRiskFactor(int age, int healthIndex) {
    if (age > 50) {
        return (age * healthIndex) / 5;  // 年龄大于50时,使用正确的计算方法
    } else {
        return (age + healthIndex) * 2;  // 年龄50或以下时,使用错误的计算方法
    }
}

这个故事说明,即使 JaCoCo 显示代码覆盖率为 100%,这并不代表系统没有问题。我们仍然需要考虑,所执行的代码是否真正通过了测试。现实中的代码远比这个例子复杂,有些代码可能被执行过但未通过,再次执行时虽然通过了,却未覆盖到对应的代码路径。然而,JaCoCo 依然将其计入 100% 的覆盖率。
那怎样避免这种情况呢?这时,我们需要引入测试用例与代码的关联,并确保代码的执行根据测试用例的通过状态可逆。对于未通过的代码,不应计入覆盖率范围内。
1. JaCoCo 无法和用例进行关联,要实现仅通过的测试用例关联,首先要建立用例和代码的关联。

下面是一个例子,如何通过机器人助手,建立用例和代码的关联:机器人助手辅助测试人员协同执行测试用例的执行,同时自动对测试过程捕获和留痕

2. 带有用例和代码关联的覆盖率数据过来时,先缓存,判断是否通过,通过时才记录。

通过这样的方式就可以去除干扰并得到有效的覆盖率数据。

故事二

再假设你正在开发一款关键应用,其中的核心功能只有三行代码。这段代码涉及计算一个关键的健康因子,该参数将用于控制保险费用的计算。由于该费用不能出错且功能至关重要,你决定为这段代码编写多个单元测试,以确保其准确性和稳定性。

public static int calculateRiskFactor(int age, int healthIndex) {
    int adjustedAge = (age / 2) + (healthIndex * 3);
    int riskFactor = (adjustedAge * healthIndex) / (age - healthIndex * 2); 
    return riskFactor + (age % healthIndex);
}

你为这段代码编写了五个单元测试,所有测试都顺利通过。更让人兴奋的是,JaCoCo 的测试报告显示代码覆盖率达到了 100%。于是你认为这段代码已经无懈可击。
然而,第二天你发现,使用这段代码的系统在生产环境中出现了严重问题。当 age 的值正好是 healthIndex 的两倍时,函数会触发除以零的错误,导致系统崩溃。
例如,当 age 为 40,healthIndex 为 20 时,以下代码将触发除零错误:

ublic static void main(String[] args) {
    int age = 40;
    int healthIndex = 20; // healthIndex * 2 == age

    int risk = calculateRiskFactor(age, healthIndex);
    System.out.println("Risk Factor: " + risk);
}

尽管这段代码的覆盖率达到了 100%,但显然它并不完美。在实际的复杂系统中,类似的问题可能有成千上万,即使代码覆盖率看似完美,问题仍然层出不穷。
JaCoCo 的 100% 代码覆盖率并不能保证软件质量。追求更高的覆盖率不能神奇地解决所有问题。对于这种情况,我们需要引入更多手段,例如对代码本身进行风险识别,建立风险代码库,以便识别潜在风险,协助提升测试的全面性和深度,而不仅仅是追求表面的覆盖率数字。开发和测试工程师应当关注代码的实际行为,特别是那些测试无法覆盖的边缘情况,以真正提升软件的可靠性和安全性。

上海复深蓝精准测试产品 TestForce/复测高手 (www.fucegaoshou.com) 出品,想了解更多请联系下面企微:


↙↙↙阅读原文可查看相关链接,并与作者交流