Статьи

Руководство по настройке TestNG и Maven

Чтобы быть полезными автоматические тесты должны выполняться очень быстро. В противном случае он не будет часто запускаться во время разработки или даже будет игнорироваться в конфигурации по умолчанию на рабочих станциях разработчика. Самое простое правило — это писать только небольшие модульные тесты, которые проверяют данный класс на наличие смежных окрестностей. Тем не менее, иногда полезно / необходимо что-то тестировать в контексте контейнера IoC (Spring, CDI, Guice) или с использованием встроенной базы данных (H2, HyperSQL, Derby). К сожалению, даже несколько таких тестов могут значительно увеличить общее время выполнения теста. У меня была такая ситуация в одном из моих проектов, и для предотвращения использования флага skipTests я разработал решение, используя группы из TestNG и плагина Maven Surefire.

Тесты были разделены на три группы:

  • очень быстрые реальные модульные тесты (все по умолчанию) — должны выполняться очень часто во время разработки (из IDE или mvn test, пакета mvn)
  • более медленная интеграция, но самодостаточные тесты (настройка контекста Spring и / или использование встроенной базы данных H2) — должны выполняться как минимум перед коммитом / push или во время работы над данной частью (из IDE или mvngration-test, mvn install)
  • реальные интеграционные тесты (требующие доступа к удаленным серверам — например, тестирование веб-сервисов или REST) ​​- должны выполняться ежедневно CI-сервером или разработчиками, работающими над интеграцией (mvn install, mvn интеграционный тест с включенным дополнительным профилем)

Для этого данные тесты (или классы тестов) должны быть помечены как «самоинтеграция» или «интеграция» (на уровне метода или класса):

1
2
@Test(groups = "self-integration")
public void shouldInitializeChainedAppInfoProperly() {
1
2
@Test(groups = "integration")
public class FancyWebServiceIntegrationTest {

Плагин Maven Surefire должен быть настроен таким образом, чтобы исключить группы тестирования «самоинтеграция» и «интеграция» из выполнения по умолчанию, а «самоинтеграция» добавить к «фазе тестирования интеграции»:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<build>
 
    <plugins>
 
        (...)
 
        <plugin>
 
            <groupId>org.apache.maven.plugins</groupId>
 
            <artifactId>maven-surefire-plugin</artifactId>
 
            <version>${ver.surefire-plugin}</version>
 
            <executions>
 
                <execution>
 
                    <id>default-test</id> <!-- to override default configuration - in fact: unit tests -->
 
                    <configuration>
 
                        <excludedGroups>self-integration,integration</excludedGroups>
 
                    </configuration>
 
                </execution>
 
                <execution>
 
                    <id>self-integration</id>
 
                    <phase>integration-test</phase>
 
                    <goals>
 
                        <goal>test</goal>
 
                    </goals>
 
                    <configuration>
 
                        <groups>self-integration</groups>
 
                        <reportsDirectory>target/self-integration-surefire-reports/</reportsDirectory>
 
                    </configuration>
 
                </execution>
 
            </executions>
 
        </plugin>
 
    </plugins>
 
</build>

Кроме того (при необходимости) можно создать отдельный отдельный профиль с группой тестирования «интеграция», настроенной на этапе «интеграция-тест».

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<profiles>
 
    (...)
 
    <profile>
 
        <id>integration</id>
 
        <build>
 
            <plugins>
 
                <plugin>
 
                    <groupId>org.apache.maven.plugins</groupId>
 
                    <artifactId>maven-surefire-plugin</artifactId>
 
                    <version>${ver.surefire-plugin}</version>
 
                    <executions>
 
                        <execution>
 
                            <id>integration</id>
 
                            <phase>integration-test</phase>
 
                            <goals>
 
                                <goal>test</goal>
 
                            </goals>
 
                            <configuration>
 
                                <groups>integration</groups>
 
                                <reportsDirectory>target/integration-surefire-reports/</reportsDirectory>
 
                            </configuration>
 
                        </execution>
 
                    </executions>
 
                </plugin>
 
            </plugins>
 
        </build>
 
    </profile>
 
</profiles>

Рабочий пример можно найти в искусственной ветке AppInfo (pom.xml и пример тестового класса). Это легко адаптировать к вашим потребностям.

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

Справка: часто выполняйте быстрые юнит-тесты, редко — медленную интеграцию — руководство по настройке TestNG и Maven от нашего партнера по JCG Марцина Заячковского из блога Solid Soft .