Maven Integration 테스트를 실행하려면 어떻게합니까


170

나는 maven2 멀티 모듈 프로젝트를 가지고 내 아이 모듈의 각 난 명명 된 JUnit 테스트가 Test.javaIntegration.java각각 단위 테스트 및 통합 테스트에 대한합니다. 내가 실행할 때 :

mvn test

*Test.java하위 모듈 내의 모든 JUnit 테스트 가 실행됩니다. 내가 실행할 때

mvn test -Dtest=**/*Integration

Integration.java하위 모듈 내 에서 테스트가 실행 되지 않습니다 .

이것들은 나에게 똑같은 명령처럼 보이지만 -Dtest = / * Integration ** 인 명령은 작동하지 않습니다. 부모 수준에서 0 개의 테스트가 실행되고 테스트는 없습니다.


4
Kief의 답변은 Maven에서 통합 테스트를 정의하기위한 현재 표준이므로 승인 된 답변이어야합니다.
heenenee

답변:


110

단위 테스트와 통합 테스트를 개별적으로 실행하도록 Maven의 Surefire를 설정할 수 있습니다. 표준 단위 테스트 단계에서는 통합 테스트와 패턴이 일치하지 않는 모든 것을 실행합니다. 그런 다음 통합 테스트 만 실행 하는 두 번째 테스트 단계작성하십시오 .

예를 들면 다음과 같습니다.

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <id>integration-test</id>
          <goals>
            <goal>test</goal>
          </goals>
          <phase>integration-test</phase>
          <configuration>
            <excludes>
              <exclude>none</exclude>
            </excludes>
            <includes>
              <include>**/*IntegrationTest.java</include>
            </includes>
          </configuration>
        </execution>
      </executions>
    </plugin>

1
내가 말한대로 이것을 구성했고 * Integration.java 파일이 아닌 * Test 만 실행할 때 실행됩니다 : mvn install 기본값으로 * Test.java를 실행해야하지만 nightlty 빌드의 경우 * Test를 모두 실행해야합니다 .java 및 * Integration.java. 나는 각 하위 하위 디렉토리에 다음 CD를 설치하고 -Dtest = ** / * 통합 테스트를 MVN 실행 MVN 실행해야
피터 딜레이 니를

66
확실한 플러그인이 아니라 통합 테스트를 위해 페일 세이프 플러그인을 사용해야합니다. 이 때까지 빌드를 실패하지 않습니다 후 통합 단계가 완료; 빌드에 실패하기 전에 테스트 리소스 (예 : 웹 서버)를 분리 할 수 ​​있습니다. 따라서 안전합니다.
John Gordon

사전 통합 단계의 일부로 부두 서버가 시작됩니다. 마지막 로그 라인은 [INFO] Jetty Server를 시작한 것입니다. 그 후에는 아무 일도 일어나지 않습니다. 붙어 요. maven surefire failsafe 플러그인은 테스트를 실행하지 않거나 부두 서버가 중지되지 않습니다. 무슨 일이야? 귀하가 지정한 것과 동일한 구성을 사용하고 있습니다.
Tarun Kumar

6
이 답변은 매우 오래된 내용이므로 업데이트하거나 제거해야합니다.
Zac Thompson

이것에 대한 도움이 있습니까? stackoverflow.com/questions/48639730/…
Rohit Barnwal

250

메이븐 빌드 라이프 사이클은 이제 "테스트"단계에서 실행하는 단위 테스트와는 별도로 실행되는 통합 테스트를 실행하기위한 "통합 테스트"단계가 포함되어 있습니다. "package"후에 실행되므로 "mvn verify", "mvn install"또는 "mvn deploy"를 실행하면 통합 테스트가 진행됩니다.

기본적으로, 통합 테스트라는 테스트 클래스를 실행 **/IT*.java, **/*IT.java그리고 **/*ITCase.java, 그러나 이것은 구성 할 수 있습니다.

이 모든 것을 연결하는 방법에 대한 자세한 내용은 Failsafe 플러그인 , Failsafe 사용 페이지 (이전 페이지에서 올바르게 링크되지 않음) 및 Sonatype 블로그 게시물을 참조하십시오 .


1
@WillV 수정. Codehaus의 묘지. 그리고 maven-failsafe-plugin은 현재 Apache에 있습니다. 죄송합니다. :)
Jin Kwon

38
기본적으로 mvn integration-test단위 테스트 (surefire를 통해 사용)도 mvn failsafe:integration-test실행 하지만 안전 장치 통합 테스트 만 실행합니다.
Shadow Man

22
놀랍게도 Failsafe 플러그인 설명서, 사용 페이지 및 FAQ에는 * / IT .java, ** / * IT.java 및 ** / * ITCase.java ... 라는 테스트 클래스를 실행한다고 언급되어 있지 않습니다 .
Henno Vermeulen

1
package단계 이후에 실행되면 모든 IT Java 소스 코드 src/main/javasrc/test/java오른쪽 대신 배치해야 합니까?
Bruce Sun

5
@HennoVermeulen 테스트 이름도 무엇인지 혼란 스러웠습니다. 테스트의 포함 및 제외에 설명되어 있습니다. 기본값을 재정의하는 것이 좋지만 이전에 기본값을 언급하면 ​​좋을 것입니다.
조슈아 테일러

63

나는 당신이하고 싶은 일을 정확하게 수행했으며 훌륭하게 작동합니다. 단위 테스트 "* Tests"는 항상 실행되며 "* IntegrationTests"는 mvn verify 또는 mvn install을 수행 할 때만 실행됩니다. 여기 내 POM의 스 니펫입니다. serg10은 거의 옳았습니다.

  <plugin>
    <!-- Separates the unit tests from the integration tests. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
       <skip>true</skip>
       <!-- Show 100% of the lines from the stack trace (doesn't work) -->
       <trimStackTrace>false</trimStackTrace>
    </configuration>
    <executions>
       <execution>
          <id>unit-tests</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
                <!-- Never skip running the tests when the test phase is invoked -->
                <skip>false</skip>
             <includes>
                   <!-- Include unit tests within integration-test phase. -->
                <include>**/*Tests.java</include>
             </includes>
             <excludes>
               <!-- Exclude integration tests within (unit) test phase. -->
                <exclude>**/*IntegrationTests.java</exclude>
            </excludes>
          </configuration>
       </execution>
       <execution>
          <id>integration-tests</id>
          <phase>integration-test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
            <!-- Never skip running the tests when the integration-test phase is invoked -->
             <skip>false</skip>
             <includes>
               <!-- Include integration tests within integration-test phase. -->
               <include>**/*IntegrationTests.java</include>
             </includes>
          </configuration>
       </execution>
    </executions>
  </plugin>

행운을 빕니다!


정확히 내가하려고 한 것이지만, 기본 테스트 단계를 거치지 않았으므로 통합 테스트는 mvn 테스트 단계에서 계속 실행되었습니다. 테스트 실행을 구성하면 재정의가 우선한다고 생각했습니다. 설명했듯이 새로운 실행을 추가하기 때문에 모든 것이 두 번 실행됩니다. 그래서 나를 위해 건너 뛰기 조각이 없었습니다. +1이 구성은 100 %로 질문에 답변합니다
Nils Schmidt

2
그런 다음 답이이 응답에 대한 확인란을 선택하십시오!
HDave

사전 통합 단계의 일부로 부두 서버가 시작됩니다. 마지막 로그 라인은 [INFO] Jetty Server를 시작한 것입니다. 그 후에는 아무 일도 일어나지 않습니다. 붙어 요. maven surefire failsafe 플러그인은 테스트를 실행하지 않거나 부두 서버가 중지되지 않습니다. 무슨 일이야? 귀하가 지정한 것과 동일한 구성을 사용하고 있습니다.
Tarun Kumar

@Tarun-문제를 다시 질문하십시오
HDave

2
이것이 정답입니다. 관련 maven 목표는 다음과 같습니다. clean compile integration-test -Dmaven.test.failure.ignore=false
Neill Lima

31

JUnit 카테고리와 Maven을 사용하여 매우 쉽게 분할 할 수 있습니다.
이것은 단위 및 통합 테스트를 분할하여 아래에 매우 간략하게 표시됩니다.

마커 인터페이스 정의

카테고리를 사용하여 테스트를 그룹화하는 첫 번째 단계는 마커 인터페이스를 만드는 것입니다.
이 인터페이스는 통합 테스트로 실행하려는 모든 테스트를 표시하는 데 사용됩니다.

public interface IntegrationTest {}

테스트 클래스를 표시하십시오

테스트 클래스 상단에 카테고리 주석을 추가하십시오. 새 인터페이스의 이름을 사용합니다.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

메이븐 유닛 테스트 구성

이 솔루션의 장점은 사물의 단위 테스트 측면에서 실제로 변화가 없다는 것입니다.
우리는 통합 테스트를 무시하도록 구성을 maven surefire 플러그인에 추가하기 만하면됩니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.11</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <excludedGroups>
            com.test.annotation.type.IntegrationTest
        </excludedGroups>
    </configuration>
</plugin>

를 수행하면 mvn clean test표시되지 않은 단위 테스트 만 실행됩니다.

Maven 통합 테스트 구성

다시 이것에 대한 구성은 매우 간단합니다.
표준 페일 세이프 플러그인을 사용하고 통합 테스트 만 실행하도록 구성합니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <groups>
            com.test.annotation.type.IntegrationTest
        </groups>
    </configuration>
</plugin>

구성은 표준 실행 목표를 사용하여 빌드의 통합 테스트 단계에서 비상 안전 플러그인을 실행합니다.

이제 할 수 있습니다 mvn clean install.
이번에는 유닛 테스트와 통합 테스트가 통합 테스트 단계에서 실행됩니다.


JUnit에는 더 이상 비밀이 없다고 생각했습니다. 좋은 자리!
gertas

4
이것은 마커 인터페이스가 Maven에서 사용 가능한 곳에 이미 존재하는 경우에만 작동합니다. 마커 인터페이스가 동일한 다중 모듈 빌드의 다른 모듈에 있으면 작동하지 않습니다.
EngineerBetter_DJ

@EngineerBetter_DJ 무슨 뜻인가요? 다중 프로젝트 기반 maven 구성이 있다면 그렇게 할 수 없습니까?
matthieusb

16

maven failsafe 플러그인을 사용해보십시오 . 특정 테스트 세트를 포함하도록 지시 할 수 있습니다.


1
+1 이것이 내가 사용하는 것입니다. 잘 작동하며 로컬 서블릿 컨테이너 시작 및 종료와 같은 사전 / 사후 설정을 수행 할 수 있습니다.
mdma

maven-failsafe-plugin플러그인 묘지에
Jin Kwon

9
묘지 페이지는 failsafe플러그인이 (으)로 이동 했다고 말합니다 maven-failsafe-plugin. maven-failsafe-plugin아직 활성 상태 인 것 같습니다 (문서는 2014 년 3 월 마지막으로 푸시되었습니다).
James Kingsbery

13

기본적으로 Maven은 클래스 이름에 Test가있는 테스트 만 실행합니다.

IntegrationTest로 이름을 바꾸면 아마도 작동 할 것입니다.

또는 Maven 구성을 변경하여 해당 파일을 포함시킬 수 있지만 테스트 이름을 SomethingTest로 지정하는 것이 더 쉽고 좋습니다.

에서 흠과 시험의 제외 :

기본적으로 Surefire 플러그인은 다음과 같은 와일드 카드 패턴을 가진 모든 테스트 클래스를 자동으로 포함합니다.

  • \*\*/Test\*.java - "Test"로 시작하는 모든 서브 디렉토리 및 모든 Java 파일 이름이 포함됩니다.
  • \*\*/\*Test.java -모든 하위 디렉토리와 "Test"로 끝나는 모든 Java 파일 이름이 포함됩니다.
  • \*\*/\*TestCase.java - "TestCase"로 끝나는 모든 서브 디렉토리 및 모든 Java 파일 이름이 포함됩니다.

테스트 클래스가 이름 지정 규칙을 따르지 않으면 Surefire 플러그인을 구성하고 포함 할 테스트를 지정하십시오.


안녕하세요, 고마워요 SomethingTest.java라는 두 가지 종류의 일반 POJO Junit 테스트가 있습니다. 또한 SomethingIntegration.java라는 통합 테스트가 실행되지 않았습니다. SomethingTest.java는 mvn test 또는 mvn install을 통해 시작됩니다. 두 번째 테스트는 시작되지 않습니다. mvn test -Dtest = ** / * Integration
Peter Delaney

.. "Maven은 클래스 이름에 Test가있는 테스트 만 실행합니다"는 "Maven surefire 플러그인은 클래스 이름에 Test가있는 테스트 만 실행합니다"를 의미합니다.
Joshua Davis

1
"클래스 이름 어딘가에" "클래스 이름은 Test로 끝납니다"(예 : MyTest는 작동하지만 MyTests는 작동하지 않음)
Julian

10

Maven과 통합 테스트를 실행하는 또 다른 방법은 프로파일 기능을 사용하는 것입니다.

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*Test.java</include>
                </includes>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>integration-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/*IntegrationTest.java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*StagingIntegrationTest.java</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
...

실행 '새로 설치 MVN' 기본 빌드를 실행합니다. 위에서 지정한대로 통합 테스트는 무시됩니다. 'mvn clean install -P integration-tests' 를 실행 하면 통합 테스트가 포함됩니다 (스테이징 통합 테스트도 무시합니다). 또한 매일 밤 통합 테스트를 실행하는 CI 서버가 있으며 'mvn test -P integration-tests' 명령을 실행 합니다.


1
통합 테스트 단계를 사용하지 않는 이유는 무엇입니까? 그러면 Arquillian처럼 다양한 앱 서버에 대한 통합 테스트와 같은 작업에 프로파일을 사용할 수 있습니다. 나는 Maven 전문가는 아니지만 전문가들이 이것이 'Maven-y'가 아니라고 말할 수 있다고 생각합니다.
Joshua Davis

1
@Joshua 내 통합 테스트를 실행하는 데 최소 5 분이 걸리고 로컬 maven 저장소에서 아티팩트를 업데이트해야하기 때문에 하루에 여러 번 'mvn clean install'을 발행하기 때문에이 방법으로 추측합니다. 사람들이 위에서 말한 것에 따르면 'install'을 실행하면 통합 테스트 단계가 실행되어 소중한 개발자 시간을 잃을 수 있습니다.
Jorge

흠 ... 통합 테스트를 실행하는 '설치'에 대해 확실하지 않습니다. 어쨌든 나는 여전히 프로파일 대신 단계를 사용합니다. 프로파일은 다른 앱 서버 등을 지원하는 데 사용하는 것이 좋습니다.
Joshua Davis

1
나는 그 다음에 놀러 갈 것입니다. 충고 감사합니다!
Jorge

@ jorge 여기에 사용하는 올바른 목표가 맞는 것 같아요?
Kilokahn

1

당신은 따를 수 받는다는 문서 빌드와 유닛 테스트를 실행하고 별도로 통합 테스트를 실행합니다.

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

이렇게하면 기본적으로 모든 통합 테스트를 비활성화 한 상태로 실행할 수 있습니다. 이를 실행하려면 다음 명령을 사용하십시오.

mvn install -DskipTests=false

0

maven surefire 플러그인 을 사용 하여 단위 테스트를 실행하고 maven failsafe 플러그인 을 사용하여 통합 테스트를 실행해야합니다.

플래그를 사용하여 이러한 테스트의 실행을 토글하려면 아래를 따르십시오.

메이븐 구성

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

따라서 아래 플래그 규칙에 따라 테스트를 건너 뛰거나 전환합니다.

아래 플래그로 테스트를 건너 뛸 수 있습니다.

  • -DskipTests 단위 및 통합 테스트를 모두 건너 뜁니다.
  • -DskipUnitTests 단위 테스트를 건너 뛰지 만 통합 테스트를 실행합니다
  • -DskipIntegrationTests 통합 테스트를 건너 뛰지 만 단위 테스트를 실행합니다

테스트 실행

단위 테스트 실행하려면 아래를 실행하십시오.

mvn clean test

아래 명령을 실행하여 테스트를 실행할 수 있습니다 (단위 및 통합 모두)

mvn clean verify

통합 테스트 실행 하려면 다음을 수행하십시오.

mvn failsafe:integration-test

또는 단위 테스트를 건너 뛰십시오

mvn clean install -DskipUnitTests

또한,시 통합 테스트를 생략하기 위해 mvn install, 다음과

mvn clean install -DskipIntegrationTests

다음을 사용하여 모든 테스트를 건너 뛸 수 있습니다

mvn clean install -DskipTests
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.