gpt4 book ai didi

junit5 - PiTest "changed conditional boundary mutation survived"无故?

转载 作者:行者123 更新时间:2023-12-01 23:43:40 26 4
gpt4 key购买 nike

我有一个小型 Java 11 示例,其中包含 JUnit 5 测试,结果如下:

changed conditional boundary → SURVIVED

主类:

public final class CheckerUtils
{
private CheckerUtils()
{
super();
}


public static int checkPort(final int port)
{
if (port < 0)
{
throw new IndexOutOfBoundsException("Port number out of range!");
}
return port;
}

}

测试类:

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;

import de.powerstat.security.CheckerUtils;


public final class CheckerUtilsTests
{
@Test
public void checkPortOk()
{
final int port = 1023;
final int resultPort = CheckerUtils.checkPort(port);
assertEquals(port, resultPort, "Port not as expected!");
}


@Test
public void checkPortNegative1()
{
final int port = -1;
assertThrows(IndexOutOfBoundsException.class, () ->
{
CheckerUtils.checkPort(port);
}
);
}


@Test
public void checkPortNegative2()
{
final int port = -1;
int resultPort = 0;
try
{
resultPort = CheckerUtils.checkPort(port);
}
catch (final IndexOutOfBoundsException e)
{
// ignore
}
assertEquals(0, resultPort, "Port is not 0");
}

}

从我的角度来看,突变不应该存活,因为:

  1. checkPortOk() 是非负合法值的正常路径
  2. checkPortNegative1() 是当 noting 发生变化并引发异常时负值的路径。
  3. checkPortNegative2():当没有任何变化时,抛出异常并且 resultPort 仍然为 0 - 所以这里的断言是正确的
  4. checkPortNegative2():当 < 0 突变为 < -1 或更低的值时,不会抛出异常,因此 resultPort 将变为 -1 并且断言将失败(突变被杀死)
  5. checkPortNegative2():当 < 0 突变为 < 1 或更高的值时,与 3 下相同。

所以我的问题是我是否错过了这里的某些内容,或者这是 Pitest (1.4.9) 中的错误?

解决方案

正如 @henry 所说,添加以下测试解决了问题:

@Test
public void checkPortOk2()
{
final int port = 0;
final int resultPort = CheckerUtils.checkPort(port);
assertEquals(port, resultPort, "Port not as expected!");
}

最佳答案

条件边界变异会变异

if (port < 0)

if (port <= 0)

由于没有一个测试提供 0 的输入,因此它们无法区分突变体和未突变的程序,并且突变体将生存。

添加一个测试用例来描述端口为 0 时的预期行为应该会杀死突变体。

关于junit5 - PiTest "changed conditional boundary mutation survived"无故?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57021853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com