PiTest“改变后的条件边界突变得以幸存”没有理由吗?

时间:2019-07-13 18:35:59

标签: junit5 java-11 pitest

我有一个带有JUnit 5测试的Java 11小示例,得出的结果很糟糕:

  

条件边界已更改→已生存

主类:

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()是在注释发生异常并引发异常时负值的路径。
  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!");
 }

1 个答案:

答案 0 :(得分:2)

条件边界突变将发生突变

if (port < 0)

收件人

if (port <= 0)

由于所有测试均未提供输入0,因此无法将突变体与未突变程序区分开,突变体将继续存在。

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