当前位置: 首页 > 面试题库 >

切换的两极分支覆盖范围:错过了19个中的7个

漆雕修能
2023-03-14
问题内容

我有此交换系统,并且正在使用eclemma测试分支覆盖范围。我们要求所有分支机构的分支覆盖率至少为80%,因此我正在尝试进行尽可能多的测试。但是,问题告诉我,此交换系统尚未在分支机构覆盖范围内进行全面测试。

pos = p.getCurrentPosition().substring(0, 1);
switch (pos) {
            case "G":
                goalkeepers++;
                break;
            case "D":
                defense++;
                break;
            case "M":
                midfield++;
                break;
            case "F":
                offense++;
                break;
            case "S":
                substitutes++;
                break;
            case "R":
                reserves++;
                break;
        }

我使用了简单的JUnit测试来处理上述每种情况。仍然有两极分化将此标记为黄色,并说“
19个分支中有7个未命中”。我要说的是,只有7种方法可以通过此交换系统(6种情况+所有未定义)。

我试图在堆栈溢出时搜索类似的问题。其中一些解决方案可以使用if / else进行全面覆盖。我不确定这是否是获得此报道的唯一途径。

谁能解释所有这19个分支的来源以及我如何测试其余的7个分支以在此开关盒上获得100%的分支覆盖率?


问题答案:

Java编译器将转换用例代码转换为tableswitchlookupswitch。在tableswitch当只有少数差距是,不同的情况之间的被使用。否则,将lookupswitch使用。

在您的案例tableswitch中,使用a 是因为 案例 的哈希码之间的距离很近(与owaism引用的代码不同):

  16: tableswitch   { // 68 to 83
                68: 111 // 'D'
                69: 183
                70: 141 // 'F'
                71: 96  // 'G'
                72: 183
                73: 183
                74: 183
                75: 183
                76: 183
                77: 126 // 'M'
                78: 183
                79: 183
                80: 183
                81: 183
                82: 171 // 'R'
                83: 156 // 'S'
           default: 183
      }

冒号左边的数字是有序的哈希码及其之间的填充空格,右边的数字是跳转目的地。(在Java中,字符的哈希码是其ASCII值。)

68是“ D”的哈希码(最低的),83是“ S”的哈希码(最高的)。 69是实际案例之间的差距之一的值,并将跳到默认案例。

但是,我假设EclEmma从a的覆盖率计算中排除了这些分支tableswitch(由于存在间隙,它将进一步降低覆盖率)。因此,我们有
0个(计数)分支。

接下来,在每个跳转目标处执行字符串值的equals比较(默认情况之一除外)。由于您的切换案例包含6个案例,因此我们有6个具有相等比较的6个跳转目标。

情况“ G”的比较字节代码如下:

  96: aload_3
  97: ldc           #10
  99: invokevirtual #11  java/lang/Object;)Z
 102: ifeq          183
 105: iconst_0
 106: istore        4
 108: goto          183
 111: aload_3

EclEmma计算两个分支:输入字符串和大小写字符串相等或不相等。因此,我们有 6 * 2个分支用于比较。 (默认情况不分支。)

接下来,如果两个字符串相等,则将存储大小写的索引(105-106大小写“
G”的字节代码行)。然后将跳到第二个tableswitch。否则,将直接执行跳转。

 185: tableswitch   { // 0 to 5
                 0: 224
                 1: 237
                 2: 250
                 3: 263
                 4: 276
                 5: 289
           default: 299
      }

此开关对先前存储的案例索引进行操作,并跳转至案例中的代码(案例“ G”具有index 0,默认案例具有-1)。EclEmma计数
7个分支(6个案例加上默认案例)。

因此,在第一个中有0个计数分支,tableswitchequals比较中有12个分支,在第二个中还有7个分支tableswitch。总之,这
导致19个分支。

您的 测试不涵盖6个不等于分支中的任何一个。
为了涵盖这些内容,您需要为每种情况找到一个不等于大小写条件但具有相同哈希码的字符串。可能,但绝对不明智…

EclEmma的分支计数可能会在将来进行调整。

而且,我猜您没有一个与任何情况都不匹配的测试用例(因此 (隐式)默认用例不包括在内。)



 类似资料:
  • 我有一个交换系统,我用eclemma测试分支覆盖率。我们需要有至少80%的分支覆盖率,所以我正在尝试尽可能多的测试。然而,eclemma告诉我,这个交换机系统在分支覆盖方面没有经过充分测试。 我使用了简单的JUnit测试来测试每一个案例。仍然eclemma将其标记为黄色,并表示“19个分支中有7个错过了”。我会说只有7种方法可以通过这个交换系统(6个单独的案例都没有定义)。 我试着在堆栈溢出上搜索

  • 我使用JaCoCo Maven插件和代理来测量和检索每晚测试的应用程序的代码覆盖率数据。这是该架构的模式: 我的Maven项目配置了JMeter Maven插件,在Maven阶段执行一些API测试,Jenkins服务器执行的Maven命令如下 正如您首先看到的,测试是通过阶段执行的,然后目标从测试服务器检索覆盖范围数据(我已将服务器配置为运行JaCo代理),最后将数据上传到我的Sonar服务器。

  • 我正在将 Gradle 4.4 用于 JaCoCo 0.8.0 的 Java 项目,并将声纳与声纳贾瓦 5.0.1 配合使用。 我有一个用龙目岛和注释的课程。 我在build.gradle中的JaCoCo配置如下所示: 此外,我有lombok.confi文件,其属性为< code > lombok . addlombokgeneratedannotation = true ,生成的内容实际上有<

  • 我们有一个多模块的maven项目。 每个模块都有一对testng和powermock单元测试用例。我们正在使用jacoco进行代码覆盖率报告。但是,jacoco在分析单元测试复盖率时基于testng单元测试用例,而忽略了powermock单元测试用例。因此,总的代码覆盖率越来越低。 如何配置jacoco来同时获取testng和jacoco测试用例?

  • 若要切换作业的分支,就要进行checkout操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容。checkout之后的提交记录将被追加到目标分支。 HEAD HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。通过移动HEAD,就可以变更使用的分支。 Note 提交时使用~(tilde)和^(caret)就可以指定某个提交的相对位置。

  • 我使用Gradle 6.3和Jacoco来编译、测试和显示覆盖率报告。但是我不明白为什么它抱怨“两个分支中的一个丢失了”,根本没有分支: 下面是完整的静态编程语言数据类: 如果幕后有树枝,它们是什么?我该如何覆盖它们?