Что происходит?
В моем предыдущем посте было показано, как использовать категории 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 .