删除对 "com.some.Filename::someMethodName" --> SURVIVED 的调用是什么意思?
What does removed call to "com.some.Filename::someMethodName" --> SURVIVED mean in pitest?
删除对“com.some.Filename::someMethodName”的调用是什么意思 --> SURVIVED 在最糟糕的情况下意味着什么。
这是否意味着如果删除该方法调用,代码仍将正常工作?
当 pitest 说突变幸存下来时,这意味着它更改了代码库,并且没有一个测试检测到代码已更改。所以你对你的测试套件要求不是很高。
理想情况下,每个创建的突变都应该被至少 1 个单元测试杀死。
更多关于突变测试的信息可能对您有帮助:https://pedrorijo.com/blog/intro-mutation/。 (免责声明,我是教程作者)
用简单的变异测试术语来说:
Faults (or mutations) are automatically seeded into your code, then your tests are run. If your tests fail then the mutation is killed, if your tests pass then the mutation lived/survived.
在大多数情况下,开发人员倾向于编写仅针对代码覆盖率的单元测试用例,这可能不会对每个用例进行测试 statement.So 使用像 PIT 这样的变异测试工具非常有用,因为它实际上可以检测到执行中的任何错误代码。但在大多数情况下,要杀死 PIT 引入的突变体,您必须编写 assert 语句。变异测试提高了测试标准,因为它强制编写测试代码的每个语句的测试用例。
这是否意味着如果删除该方法调用,代码仍将正常工作?
这并不意味着当方法调用被移除时,实际代码将起作用,而是意味着即使方法调用被移除,至少有一个测试用例没有检测到变化并且测试用例通过并且变种人幸存。
Pi-Mutation 想要:-
- 单元测试用例执行的每一行代码
- 并且被源代码修改的数据必须asserted/validated.
只要掌握以上两点就可以成为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());
}
删除对“com.some.Filename::someMethodName”的调用是什么意思 --> SURVIVED 在最糟糕的情况下意味着什么。 这是否意味着如果删除该方法调用,代码仍将正常工作?
当 pitest 说突变幸存下来时,这意味着它更改了代码库,并且没有一个测试检测到代码已更改。所以你对你的测试套件要求不是很高。
理想情况下,每个创建的突变都应该被至少 1 个单元测试杀死。
更多关于突变测试的信息可能对您有帮助:https://pedrorijo.com/blog/intro-mutation/。 (免责声明,我是教程作者)
用简单的变异测试术语来说:
Faults (or mutations) are automatically seeded into your code, then your tests are run. If your tests fail then the mutation is killed, if your tests pass then the mutation lived/survived.
在大多数情况下,开发人员倾向于编写仅针对代码覆盖率的单元测试用例,这可能不会对每个用例进行测试 statement.So 使用像 PIT 这样的变异测试工具非常有用,因为它实际上可以检测到执行中的任何错误代码。但在大多数情况下,要杀死 PIT 引入的突变体,您必须编写 assert 语句。变异测试提高了测试标准,因为它强制编写测试代码的每个语句的测试用例。
这是否意味着如果删除该方法调用,代码仍将正常工作?
这并不意味着当方法调用被移除时,实际代码将起作用,而是意味着即使方法调用被移除,至少有一个测试用例没有检测到变化并且测试用例通过并且变种人幸存。
Pi-Mutation 想要:-
- 单元测试用例执行的每一行代码
- 并且被源代码修改的数据必须asserted/validated.
只要掌握以上两点就可以成为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());
}