F: Wie erkennt man eine echte Testabdeckung?Abdeckung gegen erreichbaren Code
Ich habe ein Problem mit Code Coverage Metrik und Testqualität festgestellt: 100% Codeabdeckung bedeutet nicht, dass Code wirklich getestet wird.
Manchmal gibt Test 100% Deckung sogar, dass es nicht alles abdeckt. Das Problem liegt in der Definition der Abdeckung, wir gehen davon aus, Abdeckung == erreichbar Code.
Aber es ist nicht wahr, Code könnte zu 100% erreichbar sein, aber nicht zu 100% mit dem Test abgedeckt.
Werfen Sie einen Blick in Beispiel, dieser Test gibt 100% Abdeckung (EMMA), aber in Wirklichkeit deckt es nicht Werte, die an Service-Schein übergeben werden. Wenn also der Wert geändert wird, wird der Test nicht fehlschlagen.
Beispiel:
public class User {
public static final int INT_VALUE = 1;
public static final boolean BOOLEAN_VALUE = false;
public static final String STRING_VALUE = "";
private Service service;
public void setService(Service service) {
this.service = service;
}
public String userMethod() {
return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
}
}
Und zu testen:
public class UserTest {
private User user;
private Service easyMockNiceMock;
@Before
public void setUp() throws Exception {
user = new User();
easyMockNiceMock = EasyMock.createNiceMock(Service.class);
}
@Test
public void nonCoverage() throws Exception {
// given
user.setService(easyMockNiceMock);
expect(easyMockNiceMock.doSomething(anyInt(), anyBoolean(), (String) anyObject())).andReturn("");
replay(easyMockNiceMock);
// when
user.userMethod();
// then
verify(easyMockNiceMock);
}
}
Schade, dass es für die aktuelle Version von .net nicht funktioniert. Ich hätte es gerne für eine Runde genommen. – Gishu
Ich habe versucht, über Mutationsframeworks zu googlen, aber keiner von ihnen hat Integration mit IDE (vorzugsweise IDEA). –
Jester nahm einen ziemlich naiven Ansatz für Mutationstests und war daher eiszeitlich langsam. Wenn Sie sich Mutationstests ansehen, können Sie ein moderneres System ausprobieren, wie zum Beispiel http://pitest.org oder javalanche – henry