【问题标题】:What does removed call to "com.some.Filename::someMethodName" --> SURVIVED mean in pitest?删除对“com.some.Filename::someMethodName”的调用-> SURVIVED 意味着什么?
【发布时间】:2020-10-06 07:21:53
【问题描述】:

删除对“com.some.Filename::someMethodName”的调用是什么意思--> SURVIVED 在最糟糕的情况下意味着什么。 是不是说如果去掉那个方法调用,代码还能正常工作?

【问题讨论】:

标签: java code-coverage mutation mutation-testing pitest


【解决方案1】:

当 Pitest 说突变幸存下来时,这意味着它改变了代码库,并且没有一个测试检测到代码已经改变。因此,您对测试套件的要求并不高。

理想情况下,创建的每个突变都应该被至少 1 个单元测试杀死。

有关突变测试的更多信息可能对您有所帮助:https://pedrorijo.com/blog/intro-mutation/。 (免责声明,我是教程作者)

【讨论】:

  • 我试图在突变中覆盖的枚举调用没有被测试本身覆盖。为了将来参考,可以尝试覆盖所有枚举值的断言
【解决方案2】:

Pi-Mutation 想要:-

  1. 单元测试用例执行的每一行代码
  2. 源代码修改的数据必须经过断言/验证。

只要掌握以上两点,就可以成为pi-mutation API的大师了。

假设您有以下必须通过 pi-mutation 的源代码。

public Optional<CodeRemovedModel> method1(List<CodeRemovedModel> list) {
    if(list.isEmpty()) {
        return Optional.empty();
    }
    return doSomething(list);
}

private Optional<CodeRemovedModel> doSomething(List<CodeRemovedModel> list) {
    // iterating over list item and modifying two fields.
    // as per mutation this forEach loop must be executed
    // And, the modified fields must be asserted - if not you will get "removed call .... -> SURVIVED" error
    list.forEach(s -> {
        s.setFirstName("RAHUL");
        s.setLastName("VSK");
    });
    return Optional.of(list.get(0));
}

在以下测试用例中,我忽略了一个字段的断言,因此会出现错误。

@Test
public void testMethod1_NON_EMPTY_LIST() {
    List<CodeRemovedModel> l = new ArrayList<>();
    l.add(new CodeRemovedModel());
    Optional<CodeRemovedModel> actual = this.codeRemovedMutation.method1(l);
    assertEquals("RAHUL", actual.get().getFirstName());
    //assertEquals("VSK", actual.get().getLastName());
}

【讨论】:

    【解决方案3】:

    用简单的变异测试术语:

    错误(或突变)会自动植入您的代码中,然后运行您的测试。如果您的测试失败,则突变被杀死,如果您的测试通过,则突变存活/存活。

    在大多数情况下,开发人员倾向于编写仅针对代码覆盖率的单元测试用例,这可能不会测试每个语句。因此,使用像 PIT 这样的变异测试工具非常有帮助,因为它实际上可以检测到执行代码中的任何错误。但在大多数情况下,要杀死 PIT 引入的突变体,您必须编写断言语句。变异测试提高了测试标准,因为它强制编写测试代码的每个语句的测试用例。

    是否意味着如果删除该方法调用,代码仍然可以正常工作?

    这并不意味着当方法调用被移除时,实际代码会起作用,而是意味着即使方法调用被移除,至少有一个测试用例没有检测到变化并且测试用例通过并且突变体存活.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2011-06-28
      • 2011-12-28
      • 2020-10-12
      • 2011-06-11
      • 2010-10-02
      • 2013-01-16
      相关资源
      最近更新 更多