Как разделить модульное тестирование и интеграционное тестирование в проекте maven - PullRequest
10 голосов
/ 20 октября 2011

У меня есть проект Maven и множество классов юнитов. Я развиваю с Eclipse. Я хочу разделить классы функционального тестирования и классы интеграционного тестирования.

Когда я собираю проект в Eclipse, я хочу, чтобы выполнялись только классы функциональных тестов.

Дженкинсом они оба должны быть казнены.

Какому подходу я должен следовать?

Ответы [ 5 ]

13 голосов
/ 20 октября 2011

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

Предположим, у меня есть приложение, представленное проектом агрегатора Maven application, которое содержит модуль jar с именем project. Я держу модульные тесты внутри самого project, чтобы они выполнялись всякий раз, когда я создаю свое приложение. Это также построено каждую ночь Дженкинсом; В идеале успешные сборки должны автоматически развертываться в одной или нескольких тестовых средах как для ручных, так и для автоматических тестов. В настоящее время это делается вручную.

Для каждой среды, в которой мне нужно запускать интеграционные тесты, у меня есть applicationTestEnvX проект агрегатора Maven. Он содержит, по крайней мере, модуль projectTest, где я сохраняю те интеграционные тесты, которые не зависят от среды, а также любой код поддержки тестирования. Тесты для моего модуля project, специфичные для среды X, хранятся в модуле projectTestEnvX. У меня есть работа Дженкинса для каждого applicationTestEnvX проекта, который проводит мои тесты каждую ночь. В идеале они должны выполняться в зависимости от результата сборки приложения, но я еще не там.

Существует также прямая связь с тем, как мои проекты хранятся в Subversion и в моих рабочих пространствах Eclipse, но это другая история; -)

8 голосов
/ 20 октября 2011

Посмотрите на два плагина Maven: Surefire (для модульных тестов) и Failsafe (для интеграционных тестов).Они очень похожи друг на друга, Failsafe является клоном Surefire.

Организуйте свои тесты так, чтобы их схема именования соответствовала предлагаемой конфигурации: **/*Test.java для модульных тестов и **/*IT.java для интеграции.Surefire запускается по умолчанию, для Failsafe вам понадобится дополнительная выдержка в POM - пример и дополнительная информация в этом ответе .

Тогда значение уменьшится до mvn test или mvn integration-test.

Если вы хотите запустить интеграционный тест только в определенных средах (Jenkins), вы можете настроить Failsafe на выполнение только в профиле, например:

<profiles>
    <profile>
        <id>env-itest</id>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                 <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals><goal>integration-test</goal></goals>
                    </execution>
                    <!-- other executions, if needed -->
                 </executions>
            </plugin>
        </plugins>
    </profile>
</profiles>

Затем на Jenkins вы запустите mvn clean install -P env-itest и только в вашей локальной среде mvn clean install (или simliar).

1 голос
/ 21 октября 2011

FYI, с TestNG , вы просто используете группы, например, @Test (groups = "интеграции") и @Test (groups = "unit")Затем вы просто запускаете разные группы в зависимости от того, что вам нужно.

1 голос
/ 20 октября 2011

Вы можете разделить свои юнит-тесты и интеграционные тесты на отдельные пакеты (или, возможно, даже на отдельные исходные папки, но затем вам придется обновить конфигурацию Maven, чтобы распознать, что у вас есть две отдельные исходные папки для тестов).

Чтобы воспользоваться этим, в конфигурациях запуска Eclipse (Run> Run Configurations) создайте новую конфигурацию запуска JUnit, в которой «Выполнить все тесты в выбранном проекте, пакете или исходной папке:» выберите пакет Папка / source, содержащая только те тесты, которые вы хотите запустить.


Когда я впервые прочитал твой вопрос, я понял его задом наперед. Я думал, что вы хотите запустить полный набор в Eclipse и только подмножество в Jenkins. Я просто оставлю свой старый ответ на случай, если вы найдете это полезным, как:

То, как я делал это раньше, - это соглашение об именах тестовых случаев JUnit.

Я бы назвал все контрольные тесты ...UnitTest (например, RegistrationManagerUnitTest) и интеграционные тесты, я бы назвал ...IntegrationTest (например, RegistrationDaoIntegrationTest).

Затем в Maven вы можете настроить его для запуска всех тестовых случаев, классы которых заканчиваются на ...UnitTest (по умолчанию он ищет классы, имена которых заканчиваются на ...Test. Что-то вроде:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <!-- Run only tests whose name end with "UnitTest" -->
        <includes>
            <include>**/*UnitTest.java</include>
        </includes>
    </configuration>
</plugin>
1 голос
/ 20 октября 2011

Ознакомьтесь с документацией maven по фазе интеграционных тестов - вы можете использовать различные плагины для управления тем, какие тесты запускаются, просто присвоив им соответствующие имена.

Затем, запустив mvn test, соберите и запустите ваш код и модульные тесты, которые mvn verify также запустит и ваши интеграционные тесты.

...