Покрытие кода тестами (Code Coverage) — это метрика, которая показывает, какая часть исходного кода была выполнена во время запуска тестов. Она помогает оценить, насколько полно тесты проверяют ваш код. Высокое покрытие не всегда гарантирует качество тестов, но низкое покрытие часто указывает на недостаточное тестирование.
Покрытие строк (Line Coverage)
Показывает, сколько строк кода было выполнено во время тестов. Например, если из 100 строк кода было выполнено 80, то покрытие составляет 80%.
Покрытие ветвей (Branch Coverage)
Показывает, сколько ветвей (условий) в коде было протестировано. Например, если у вас есть условие if-else
, то покрытие ветвей будет 100%, только если тесты проверяют как if
, так и else
.
Покрытие методов (Method Coverage)
Показывает, сколько методов было вызвано во время тестов. Например, если в классе 10 методов, а тесты вызывают только 8, то покрытие методов составляет 80%.
Покрытие условий (Condition Coverage)
Показывает, сколько логических условий (например, в if
или while
) было полностью протестировано. Это более детальная метрика, чем покрытие ветвей.
JaCoCo — это популярный инструмент для измерения покрытия кода в Java-проектах. Он интегрируется с Maven, Gradle и IDE, такими как IntelliJ IDEA и Eclipse.
Добавьте плагин 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 в ваш 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/
.
IntelliJ IDEA имеет встроенную поддержку измерения покрытия кода. Вы можете запустить тесты с измерением покрытия следующим образом:
Run 'TestClass' with Coverage
.EclEmma — это плагин для Eclipse, который предоставляет функциональность, аналогичную JaCoCo.
Run As > Coverage As
.Предположим, у вас есть следующий класс:
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:
Помните, что высокое покрытие кода не всегда означает качественные тесты. Важно не только количество, но и качество тестов, включая проверку граничных случаев и обработку ошибок.