Статьи

Выполнение модульных и интеграционных тестов отдельно с Maven Failsafe и TestNG

Недавно для моего нового проекта для домашних животных я решил, что хотел бы, чтобы некоторые тесты выполнялись во время стандартного теста mvn, а некоторые — только на другой фазе, назовем это фазой интеграции. Я гуглил и гуглил, и, похоже, ничего не получалось, поэтому, изо всех сил пытаясь выполнить настройку, я решил записать свои выводы о том, как мне удалось настроить TestNG с Maven для отдельного запуска интеграции и модульных тестов.

Базовая (не рабочая) настройка

Для тестирования интеграции есть плагин Maven Failsafe, который должен делать то, что мы хотим, из коробки. К сожалению, все не так просто и просто, как мы могли бы ожидать.

Давайте посмотрим на основные настройки, которые должны работать:

У нас есть два тестовых класса, один с IT-постфиксом, который будет указывать, что это наш интеграционный тест:

01
02
03
04
05
06
07
08
09
10
11
import org.testng.annotations.Test;
 
import static org.fest.assertions.Assertions.assertThat;
 
public class ExampleUnitTest {
 
    @Test
    public void shouldPass() {
        assertThat(false).isFalse();
    }
}

и

01
02
03
04
05
06
07
08
09
10
11
import org.testng.annotations.Test;
 
import static org.fest.assertions.Assertions.assertThat;
 
public class StatusTestIT {
 
    @Test
    public void shouldFail() {
        assertThat('aaa').isEqualTo('');
    }
}

а теперь давайте объявим плагин, упомянутый выше, в нашем pom.xml:

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
<project>
 
    <!-- ... -->
    <build>
        <plugins>
            <!-- ... -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.9</version>
            </plugin>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.13</version>
                <configuration>
                    <includes>
                        <include>**/*IT.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

После этого мы должны увидеть две вещи. Тест mvn должен пройти, так как у нас есть один зеленый тест в классе ExampleUnitTest, но mvn failsafe: интеграция теста должна завершиться с StatusTestIT красным. Но, как я уже говорил, это не работает. Тест mvn выглядит так, как ожидалось, но второе выполнение Maven также проходит, показывая, что тест не был выполнен. Плагин, кажется, пропускает наш полностью действительный тест

Небольшое исправление делает свою работу

После тестирования различных подходов я обнаружил, что все, что нам нужно для этой настройки, — это добавить выполнение плагинов к фазе интеграционных испытаний жизненного цикла maven. Это небольшое изменение, но теперь наши интеграционные тесты выполняются только тогда, когда мы вызываем mvn интеграционный тест .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.13</version>
    <configuration>
        <includes>
            <include>**/*IT.java</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <id>failsafe-integration-tests</id>
            <phase>integration-test</phase>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
    </executions>
</plugin>

И это все, мы могли бы выполнять интеграционные тесты только тогда, когда мы действительно этого хотим. Конечно, есть некоторые вещи, которые следует помнить при принятии настройки, описанной выше:

  • наши модульные тесты должны иметь тестовый постфикс, если вы используете что-то еще, мы должны настроить плагин surefire, используя include
  • во время интеграционных испытаний также выполняются юнит-тесты. Это небольшой недостаток в этой настройке, но исключить ** / * Test.java, кажется, не работает

Справка: Запуск модульных и интеграционных тестов отдельно с Maven Failsafe и TestNG от нашего партнера JCG Томаша Дзюрко в блоге Code Hard Go Pro .