在 Java 中构造嵌套条件循环的循环覆盖率

Constructing loop coverage for nested conditional loops in Java

提问人:Kenny Ynnek 提问时间:11/16/2023 最后编辑:Kenny Ynnek 更新时间:11/18/2023 访问量:57

问:

我目前正在学习 Java 中的代码覆盖率测试,特别是循环覆盖率。从上下文来看,循环覆盖涉及运行循环 0、1 和 >1 次。但是,我遇到了我正在尝试测试的特定函数结构的问题。

结构如下:

function() {
    if(A){
        //do something here as well

        while(A){
            //do something
        }
    }
}

while 循环嵌套在 if 语句中,两者具有完全相同的条件 A。这种结构似乎阻止我创建一个测试用例,其中 while 循环将执行零次,因为如果 A 为 false,封闭的 if 语句将阻止进入循环。

鉴于这种结构,如何构建为 while 循环提供循环覆盖率(0、1、>1 次迭代)的测试用例?

编辑:很抱歉,如果问题不合适或太愚蠢而无法回答,请告诉我这个问题有什么问题,下次我不会问类似的问题。

Java 单元测试 junit while-loop 代码覆盖率

评论


答:

1赞 Mureinik 11/16/2023 #1

假设你有一个语句(或几个语句)改变了循环内部的值,否则,一旦输入,它将是一个无限循环。A

其中两种情况很简单:
对于 ,您需要一个值 that's ,以及一些导致在第一次迭代中成为的附加条件。
对于 ,您需要一个值 that's ,以及一些额外的条件,以确保在循环的第一次迭代中保留,但可能在一段时间后成为。
1AtrueAfalse>1AtrueAtruefalse

对于 的覆盖率,在评估循环条件但从未输入的意义上,您就有问题了。假设 下的 “do something here as well” does not change of 的值,则根本无法评估循环条件而不输入它。这种情况需要 ,但如果是,甚至无法到达循环。0ifAAfalse

0赞 Reilas 11/17/2023 #2

利用面向对象的设计

boolean A() {
    return System.currentTimeMillis() % 2 == 0;
}

@Test
void B() {
    //do something here as well
}

@Test
void C() {
    //do something
}

void f() {
    if (A()) {
        B();
        while (A()) {
            C();
        }
    }
}