Запобігайте одиничним тестам, але дозволяйте інтеграційні тести в Maven


157

У мене є збірка Maven, в якій я використовую плагін SureFire для запуску одиничних тестів, а плагін FailSafe - для виконання деяких інтеграційних тестів. Я хотів би спосіб запустити лише тести плагіну FailSafe.

Для мене не дуже вдале рішення додавати різні профілі чи що-небудь у пам’яті, оскільки це мультимодульна збірка, і я не хочу редагувати пам’яті кожного модуля.

Є skip.testsі maven.test.skipта skipTestsякі зупиняють всі випробування, і skipITs, який зупиняється тільки безвідмовне плагін.

Отже, чи існує прапор командного рядка для Maven skipITs, але замість цього функціонал "onlyITs"?


Ви спробували maven.test.skipчи skipTests?
Томас

1
@khmarbaise в теорії, так. Але в більшості проектів, над якими я працював, "одиничні тести", де насправді тести на інтеграцію з db пам'яті (якщо вам пощастило)
Шон Патрік Флойд

9
@khmarbaise Багато одиниць тестів. Вони бігають кілька хвилин, і нам не потрібно, щоб вони бігли за цієї обставини. Зокрема, ми проводимо одиничні тести перед тим, як створити артефакт (звичайно), але хочемо запустити ІТ у кількох середовищах. У цій точці немає повторного запуску одиничних тестів.
Меттью Гілліард

2
Привіт @khmarbaise, у моїй програмі skipTestsпропускаються лише перевірені тести, а не тест на безпеку! Можливо, це нова функція?
данідемі

2
FYI: skipTests тепер застаріло у програмі Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Гійом Хуста

Відповіді:


170

Я знайшов найпростіший спосіб пропустити лише тести для надійної перевірки - це налаштувати перевірку ( але не відмовитись ) наступним чином:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Це дозволяє запускати mvn verify -Dskip.surefire.testsі пропускатимуться лише надійні, а не безвідмовні, тести; він також запустить усі інші необхідні фази, включаючи попередню інтеграцію та постінтеграцію, а також виконає verifyмету, яка необхідна для того, щоб фактично провалити свою побудову, якщо ваші тести на інтеграцію не зможуть.

Зауважте, що це переосмислює властивість, що використовується для вказівки про тестування тестів, тому, якщо ви надаєте канонічний -DskipTests=true, надійний файл проігнорує його, але пошкодження буде захищено, що може бути несподіваним, особливо якщо у вас вже є збірки / користувачі, які вказали цей прапор. Простий спосіб вирішення, схоже, за замовчуванням skip.surefire.testsзначення skipTestsу вашому <properties>розділі пам’яті:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Якщо вам потрібно, ви можете надати аналогічний параметр, який називається " skip.failsafe.testsfailsafe", однак я не вважав це необхідним - оскільки одиничні тести зазвичай виконуються на більш ранній фазі, і якщо я хочу запустити одиничні тести, але не тести інтеграції, я би запустив testфази замість verifyфази. Ваш досвід може відрізнятися!

Ці skip.(surefire|failsafe).testsвластивості, ймовірно, повинні бути інтегровані в сам код підтвердженої / відмовної безпеки, але я не впевнений, наскільки це буде порушувати "вони точно такий самий плагін, за винятком 1 ефірної різниці".


4
Використовуючи це рішення, я зміг налаштувати свій фреймворк, щоб -DskipUnitTests пропускає плагін надійної версії, -DskipIntegrationTests пропускає плагін, і DskipTests пропускає над обома. Саме те, що було потрібно!
Алекс Янсен

2
мій IDE скаржиться на "не вдається вирішити символ" skipTests ". Рішення полягало в тому, що додавання рядка <skipTests>false</skipTests>все ще працює з будь-якою комбінацією -DskipTests або -Dskip.surefire.tests, оскільки аргументи командного рядка, схоже, замінюють властивості stackoverflow.com/questions/13708738 /… Ви можете додати це до свого рішення
глобального хромування

<skipTests>${skip.surefire.tests}</skipTests>не працює з maven-surefire-pluginверсією 3.0.0-M3. Всі перевірочні випробування все ще запущені. Хтось ще знайшов це? Наведене нижче рішення Шона Патріка Флойда працює.
Джон Мейєр

120

Обхідним способом було б закликати:

mvn clean test-compile failsafe:integration-test

Справді, це некрасиво, але це може вирішити вашу проблему.


Або (інший хак):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Довідка:


1
Друга пропозиція спрацювала для мене. попередньо інтеграційний тест був успішно названий
Lawrence Tierney

7
Це гарна ідея? Не вдасться цей результат досягти успіху у вашій збірці, навіть якщо ваші інтеграційні тести не зможуть? У цьому вся суть безвідмовної безпеки, якщо ви також не виконаєте мету "перевірити" . Цитата: "Плагін Failsafe не вийде з ладу під час фази інтеграції-тесту". Потрібно запустити ціль підтвердження, щоб фактично повідомити вам, чи вдалися інтеграційні тести чи ні!
бакар

2
@bacar правильно, але просто використовувати verifyзамість integration-test2-го рішення.
Меттью Гілліард

1
Ви дійсно повинні побачити @bacar відповідь для набагато кращого рішення.
ФББ

12
Якщо додати failsafe:verifyдо кінця першого хака ( mvn clean test-compile failsafe:integration-test failsafe:verify), збірка не вдасться, якщо один із тестів інтеграції не вдасться.
Shadow Man

73

Я використовую код із блогу Антоніо Гонкалвеса , який працює ідеально.

Ви можете використовувати такі властивості:

-DskipUTs=true для пропускання надійних тестів.

-DskipITs=true для пропуску надійних тестів.

-DskipTests=true для пропускання всіх тестів.

Це pom.xmlнаступне:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>

2
дякую, чудовий підхід! також корисно переосмислити виконання за замовчуванням тестування (тест за замовчуванням) див.: stackoverflow.com/questions/11935181/…
pls

1
саме тому іноді доводиться прокручувати вниз і шукати приємне робоче рішення з усією необхідною інформацією. Дякуємо за обмін
Атул Чадхарі

Дійсно приємне рішення. Однак конфігурація відмов у роботі є надмірною, як skipITsі за замовчуванням.
timomeinen

SkipIT - це спеціальна опція в цій конфігурації. Ви маєте рацію в реалізації за замовчуванням, але це не було питанням щодо ОП.
Martijn Burger

Кудо, ти - гуру мавена! Це має бути в Maven superpom.
Адам

22

Сподіваюся, це допомагає!

Спробуйте запустити тест лише з FailSafe (плагін для інтеграції-тесту - він дозволить запускати лише тести інтеграції з таким видом іменувань, за замовчуванням: * / IT .java, ** / IT.java, * /*ITCase.java ;, але ви можете легко змінити це з файлу pom)

mvn failsafe:integration-test

І коли ви хочете використовувати тільки SureFire (плагін для тестування одиниць)

mvn surefire:test

або один тест одночасно з:

mvn -Dtest=MyUnitlTest

9

Мені це подобається, тому всі етапи зазвичай виконуються:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
Це найпростіше (і, чесно кажучи, найяскравіше) рішення!
Титул

не вимагає додавання нічого в пам’яті, як запитував ОП, і виконує всі етапи, як зазначено. чудова відповідь.
jnichols959

1

Щоб розширити коментарі від @danidemi та @GuillaumeHusta:

FYI: skipTests тепер застаріло в плагін Failsafe 3.0.0-M3 ( SUREFIRE-1611 )

Отже, щоб пропустити тести модулів, але не тести інтеграції, ви можете це зробити, якщо використовуєте останню версію плагіна Failsafe:

mvn verify -DskipTests

(будь ласка, дайте вищезгадані коментарі, якщо це допоможе вам)


-3

Спробуйте запустити інтеграційні чи одиничні тести в окремому профілі. Тоді ви можете просто включити / відключити профіль.


Можливо, додайте батьківський пом, у якому ви визначаєте профіль, на якому працює лише ІТ? всі підмодулі проекту можуть успадкувати форму пам’яті, тому вам не потрібно буде змінювати кожен пом або запускати модулі спеціальними перемикачами (оскільки ви можете активувати профіль у відсутність властивості).
yoosiba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.