Поиск бесполезных модульных тестов с помощью PIT

Предположим, у нас есть код, который мы хотели бы протестировать:

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() в приведенном выше случае (при условии, что мой охват мутаций высок)?


person Bass    schedule 27.02.2015    source источник
comment
Я не верю, что pitest предназначен для обнаружения такого рода неудач. Однако +1 за использование pitest! Слишком мало кто этим пользуется...   -  person fge    schedule 27.02.2015
comment
ну, если вы вносите плохие изменения в код, а некоторые тесты не ломаются, их можно подозревать ;)   -  person vikingsteve    schedule 27.02.2015


Ответы (2)


В настоящее время нет ничего встроенного в pitest, но данные, которые вам нужны для обнаружения бесполезных (с точки зрения обнаружения ошибок) тестов, есть.

XML-отчет выводит уничтожающий тест для каждой мутации (часто на уровне тестового метода). Любой тест, который не убивает мутацию, можно удалить, не влияя на оценку мутации.

Конечно, тесты, которые не убивают мутацию, могут быть полезны по другим причинам, например. описание того, что делает единица.

Однако крайний случай, показанный в вашем примере, будет более эффективно обнаруживаться с помощью статического анализа - тест явно не выполняет какой-либо код, поэтому не может обнаружить в нем ошибки.

person henry    schedule 27.02.2015

Я разработал ручной метод https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-Estimation PIT может дать вам несколько советов.

person Łukasz Bownik    schedule 22.01.2021