Q: как определить реальный охват тестирования?
Я заметил одну проблему с метрикой покрытия кода и качеством теста: 100% охват кода не означает, что код действительно протестирован.
Иногда тест дает 100% -ый охват, даже если он не охватывает все. Проблема лежит в определении покрытия, мы предполагаем охват == доступный код.
Но это не так, код может быть на 100% доступным, но не на 100% покрытым тестом.
Взгляните на пример, этот тест дает 100% охват (EMMA), но на самом деле он не охватывает значения, которые будут переданы в сервисный макет. Таким образом, если значение будет изменено, тест не будет терпеть неудачу.
Пример:
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);
}
}
И протестируйте его:
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);
}
}