Как измерить покрытие кода тестами (code coverage)?java-97

Покрытие кода тестами (Code Coverage) — это метрика, которая показывает, какая часть исходного кода была выполнена во время запуска тестов. Она помогает оценить, насколько полно тесты проверяют ваш код. Высокое покрытие не всегда гарантирует качество тестов, но низкое покрытие часто указывает на недостаточное тестирование.

Основные типы покрытия кода

  1. Покрытие строк (Line Coverage)
    Показывает, сколько строк кода было выполнено во время тестов. Например, если из 100 строк кода было выполнено 80, то покрытие составляет 80%.

  2. Покрытие ветвей (Branch Coverage)
    Показывает, сколько ветвей (условий) в коде было протестировано. Например, если у вас есть условие if-else, то покрытие ветвей будет 100%, только если тесты проверяют как if, так и else.

  3. Покрытие методов (Method Coverage)
    Показывает, сколько методов было вызвано во время тестов. Например, если в классе 10 методов, а тесты вызывают только 8, то покрытие методов составляет 80%.

  4. Покрытие условий (Condition Coverage)
    Показывает, сколько логических условий (например, в if или while) было полностью протестировано. Это более детальная метрика, чем покрытие ветвей.

Инструменты для измерения покрытия кода

1. JaCoCo

JaCoCo — это популярный инструмент для измерения покрытия кода в Java-проектах. Он интегрируется с Maven, Gradle и IDE, такими как IntelliJ IDEA и Eclipse.

Настройка JaCoCo в Maven

Добавьте плагин JaCoCo в ваш pom.xml:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

После этого выполните команду:

mvn clean test

JaCoCo создаст отчет в формате HTML, который можно найти в директории target/site/jacoco/.

Настройка JaCoCo в Gradle

Добавьте плагин JaCoCo в ваш build.gradle:

plugins {
    id 'jacoco'
}

jacoco {
    toolVersion = "0.8.10"
}

test {
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    reports {
        xml.required = true
        csv.required = false
        html.required = true
    }
}

Запустите тесты и создайте отчет:

./gradlew test jacocoTestReport

Отчет будет доступен в директории build/reports/jacoco/test/html/.

2. IntelliJ IDEA

IntelliJ IDEA имеет встроенную поддержку измерения покрытия кода. Вы можете запустить тесты с измерением покрытия следующим образом:

  1. Откройте класс с тестами.
  2. Нажмите правой кнопкой мыши на класс или метод и выберите Run 'TestClass' with Coverage.
  3. После выполнения тестов IDEA покажет процент покрытия для каждого класса, метода и строки.

3. Eclipse

EclEmma — это плагин для Eclipse, который предоставляет функциональность, аналогичную JaCoCo.

  1. Установите плагин EclEmma через Marketplace.
  2. Запустите тесты с помощью Run As > Coverage As.
  3. Eclipse покажет покрытие кода в виде цветных маркеров в редакторе кода.

Пример измерения покрытия кода

Предположим, у вас есть следующий класс:

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divisor cannot be zero");
        }
        return a / b;
    }
}

И тест для этого класса:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {

    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    public void testDivide() {
        Calculator calculator = new Calculator();
        assertEquals(2, calculator.divide(6, 3));
    }
}

После запуска тестов с JaCoCo вы увидите, что методы subtract и multiply не были покрыты тестами, а также не было проверено исключение в методе divide.

Резюмируем

Измерение покрытия кода тестами — это важный этап в разработке, который помогает оценить, насколько полно тесты проверяют ваш код. Основные инструменты для измерения покрытия в Java:

  • JaCoCo: Интегрируется с Maven и Gradle, предоставляет детальные отчеты.
  • IntelliJ IDEA: Встроенная поддержка покрытия кода.
  • EclEmma: Плагин для Eclipse.

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