Предположим, у нас есть код, который мы хотели бы протестировать:
class C {
int doSmth() {
return 1;
}
}
Теперь предположим, что у нас есть 2 модульных теста, помещенных в один класс. 1-й «тестирует все», а 2-й «ничего не делает»:
@RunWith(JUnit4.class)
public final class CTest {
@Test
@SuppressWarnings("static-method")
public void testDoSmth() {
assertEquals(1, new C().doSmth());
}
@Test
@SuppressWarnings("static-method")
public void testDoSmth2() throws Exception {
Thread.sleep(1000);
}
}
Это пример из реальной жизни: я видел десятки тестов, «исправленных» путем замены содержимого теста бесполезным кодом, поскольку контракт тестируемого кода со временем меняется.
Теперь «входная» единица PIT представляет собой класс, содержащий методы тестирования (а не сам метод тестирования), поэтому в приведенном выше случае PIT не только покажет 100% покрытие строк, но и 100% покрытие мутаций.
Хорошо, я рад узнать, что у меня есть 100% охват мутаций, но как мне определить бесполезный тест — testDoSmth2()
в приведенном выше случае (при условии, что мой охват мутаций высок)?