Статьи

Простое покрытие единиц и кода интеграции

В этом примере показано, как создать покрытие для модульных и интеграционных тестов с использованием Maven и Sonar. Он использует очень простые методы и должен занять всего 10-15 минут для запуска в любой существующей сборке Maven. Он может использоваться в модуле, интеграции, ATDD или любом другом наборе тестов. Результаты покрытия показаны в сонар.

Что происходит?

В моем предыдущем посте было показано, как использовать категории JUnit для простого разделения наборов тестов модулей и интеграции.
http://johndobie.blogspot.com/2012/04/unit-and-integration-tests-with-maven.html

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

Код

Код для примера здесь.

1
2
svn co https://designbycontract.googlecode.com/svn/trunk/examples/maven/categories-sonar
mvn clean install sonar:sonar

сонар

Этот пример использует Sonar для отображения метрик покрытия кода. Sonar — это фанатичный инструмент с открытым исходным кодом, на который должен обратить внимание каждый.
http://www.sonarsource.org/

Для нашего примера есть пара простых изменений конфигурации, которые необходимы.
Следующая ссылка показывает, как установить Sonar и внести изменения
http://johndobie.blogspot.com/p/setting-up-sonar.html

Разделение тестовых наборов.

Этот пример использует категории JUnit для разделения наших тестов.

Мы определяем интерфейс маркера и затем применяем его к тестам, которые хотим разделить.

1
public interface IntegrationTest {}

Категория аннотации добавлена ​​в ваш тестовый класс. Требуется имя вашего нового интерфейса.

1
2
3
4
5
6
7
8
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
 @Test
 public void longRunningServiceTest() throws Exception {
     
 }
}

Весь процесс очень прост и полностью объясняется здесь
http://johndobie.blogspot.com/2012/04/unit-and-integration-tests-with-maven.html

Анализ покрытия кода

Мы используем плагин jacoco для покрытия кода. Здесь есть обзор Jacoco.
http://johndobie.blogspot.com/2012/01/unit-test-code-coverage.html
Сначала мы определим каталоги для файлов покрытия jacoco.

01
02
03
04
05
06
07
08
09
10
11
12
<coverage.reports.dir>
  ${basedir}/target/coverage-reports
</coverage.reports.dir>
<sonar.jacoco.reportPath>
  ${coverage.reports.dir}/jacoco-unit.exec
</sonar.jacoco.reportPath>
<sonar.jacoco.itReportPath>
  ${coverage.reports.dir}/jacoco-it.exec
</sonar.jacoco.itReportPath>
<sonar.jacoco.jar>
  ${basedir}/lib/jacocoagent.jar
</sonar.jacoco.jar>

Настройте юнит-тесты

Затем мы запускаем модульные тесты, запустив стандартный плагин surefire с агентом Jacoco, указывающим на $ {sonar.jacoco. reportPath} . Это используется для хранения результатов покрытия кода модульного теста.

01
02
03
04
05
06
07
08
09
10
11
12
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.7.2</version>
<configuration>
 <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath},includes=com.*</argLine>
 <includes>
  <include>**/*.class</include>
 </includes>
 <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
</configuration>
</plugin>

мы игнорируем любые помеченные интеграционные тесты со следующим конфигом

1
<excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>

Настройте интеграционные тесты

Для интеграционных тестов мы используем отказоустойчивый плагин и указываем агенту Jacoco на $ {sonar.jacoco. itReportPath} . Это используется для хранения результатов покрытия кода интеграционного теста.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<plugin>
<plugin>
 <artifactId>maven-failsafe-plugin</artifactId>
 <version>2.12</version>
 <dependencies>
  <dependency>
   <groupId>org.apache.maven.surefire</groupId>
   <artifactId>surefire-junit47</artifactId>
   <version>2.12</version>
  </dependency>
 </dependencies>
 <configuration>
  <groups>com.test.annotation.type.IntegrationTest</groups>
 </configuration>
 <executions>
  <execution>
   <goals>
    <goal>integration-test</goal>
   </goals>
   <configuration>
    <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.itReportPath},includes=com.*</argLine>
    <includes>
     <include>**/*.class</include>
    </includes>
   </configuration>
  </execution>
 </executions>
</plugin>

Мы также говорим плагину использовать правильные категории JUnit

1
2
3
<configuration>
 <groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>

Когда они будут запущены, они создадут следующие 2 файла покрытия.

Запустить сонар

Перед запуском сборки необходимо запустить сервер Sonar.
http://johndobie.blogspot.com/p/setting-up-sonar.html

Запуск примера

Мы можем запустить весь лот, используя следующую команду

1
mvn clean install sonar:sonar

Вы увидите следующие результаты, если перейдете к своему экземпляру сонара.

Ссылка: Простое покрытие кода блока и интеграции от нашего партнера JCG Джона Доби в блоге Agile Engineering Techniques .