删除对“com.some.Filename::someMethodName”的调用-> SURVIVED 意味着什么。这是否意味着如果删除该方法调用,代码仍然可以正常工作?
3 回答
当 Pitest 说突变幸存下来时,这意味着它改变了代码库,并且没有一个测试检测到代码已经改变。因此,您对测试套件的要求并不高。
理想情况下,创建的每个突变都应该被至少 1 个单元测试杀死。
有关可能对您有所帮助的突变测试的更多信息:https ://pedrorijo.com/blog/intro-mutation/ 。(免责声明,我是教程作者)
Pi-Mutation 想要:-
- 每一行代码都由单元测试用例执行
- 源代码修改的数据必须断言/验证。
只要掌握以上两点,就可以成为 pi-mutation API 的高手。
假设您有以下必须通过 pi 突变的源代码。
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());
}
在简单突变测试术语中:
错误(或突变)会自动植入您的代码中,然后运行您的测试。如果您的测试失败,则突变被杀死,如果您的测试通过,则突变存活/存活。
在大多数情况下,开发人员倾向于编写仅针对代码覆盖率的单元测试用例,这可能不会测试每个语句。因此使用像 PIT 这样的突变测试工具非常有帮助,因为它实际上可以检测到执行代码中的任何错误。但在大多数情况下,要杀死 PIT 引入的突变体,您必须编写断言语句。变异测试提高了测试标准,因为它强制编写测试代码的每个语句的测试用例。
这是否意味着如果删除该方法调用,代码仍然可以正常工作?
这并不意味着当方法调用被删除时,实际代码会起作用,而是意味着即使方法调用被删除,至少有一个测试用例没有检测到变化并且测试用例通过并且突变体存活。