Поиск бесполезных юнит-тестов с PIT
Предположим, у нас есть код, который мы хотели бы протестировать:
class C {
int doSmth() {
return 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);
}
}
Это пример IRL: я видел десятки "исправленных" тестов, заменив их содержимое каким-то бесполезным кодом, поскольку контракт тестируемого кода со временем меняется.
Теперь "входная" единица PIT - это класс, содержащий методы тестирования (а не отдельный метод тестирования), поэтому в приведенном выше случае PIT будет показывать не только 100% покрытие линии, но и 100% покрытие мутации.
Хорошо, я рад узнать, что у меня 100% охват мутациями, но как мне определить бесполезный тест? testDoSmth2()
в приведенном выше случае (при условии, что у меня высокий уровень мутаций)?
2 ответа
В настоящее время нет ничего, что могло бы быть использовано для проверки, но данные, необходимые для обнаружения бесполезных (с точки зрения обнаружения неисправностей) тестов, есть.
В отчете XML выводится тест на убийство для каждой мутации (часто на уровне метода теста). Любой тест, который не убивает мутацию, может быть удален без влияния на показатель мутации.
Конечно, тесты, которые не убивают мутацию, могут быть полезны и по другим причинам, например, для описания того, что делает юнит.
Экстремальный случай, показанный в вашем примере, однако, будет более эффективно обнаруживаться статическим анализом - тест явно не выполняет никакого кода, поэтому не может обнаружить ошибки в нем
Я разработал ручной метод https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-EstimationPIT может дать вам некоторые подсказки.