IT박스

Maven 설치 목표에서 테스트를 건너 뛰고 Maven 테스트 목표에서 실행하는 방법은 무엇입니까?

itboxs 2021. 1. 5. 07:51
반응형

Maven 설치 목표에서 테스트를 건너 뛰고 Maven 테스트 목표에서 실행하는 방법은 무엇입니까?


동일한 폴더 (src / test / java)에 통합 및 단위 테스트가 모두 포함 된 다중 모듈 maven 프로젝트가 있습니다. 통합 테스트는로 표시됩니다 @Category(IntegrationTest.class). 다음 설정으로 끝내고 싶습니다.

  1. 을 실행하면 mvn install모든 테스트를 컴파일하고 싶지만 실행하고 싶지는 않습니다.
  2. 을 실행하면 mvn test모든 테스트가 컴파일되지만 단위 테스트 만 실행됩니다.
  3. mvn integration-test실행하면 모든 테스트를 컴파일하고 실행하고 싶습니다.

중요한 점은 pom.xml추가 명령 줄 인수없이이 구성을 원한다는 것 입니다.

현재 저는 부모 pom.xml에서 다음 설정을 생각해 냈습니다. 유일한 문제는 모든 테스트가 실행되는 # 1입니다.

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${project.java.version}</source>
                    <target>${project.java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                    <excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.class</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

모든 자식 모듈에는 pom.xml에 다음 플러그인 구성이 있으며 부모 pom에서 상속해야한다고 생각합니다.

<build> 
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>

        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
    </plugins>
</build>

을 사용해 보았지만 <skipTests>true</skipTests>모든 목표에 대해 테스트 실행을 비활성화하는데, 이는 제가 원하는 것이 아닙니다 (# 2 및 # 3 위반). 옵션 mvn test존중하는 것도 매우 이상 합니다 skipTests=true... 왜 처음부터 실행하고 싶습니까 ??

몇 시간 동안 인터넷 검색과 다른 조합을 시도한 후에서 테스트를 실행하지 않는 mvn install동시에에서 실행하는 것이 가능한지 망설 입니다 mvn test. 누군가가 이것이 틀렸다는 것을 증명하기를 바랍니다. ;)

또한 mvn install단위 테스트 만 실행 하는 솔루션을 기꺼이 받아 들일 수 있지만 큰 차이는 없다고 생각합니다.


Maven 빌드 수명주기 개념을 이해하지 못한 것 같습니다 . 당신은 실행하면 mvn install합니다 (를 포함하여 모든 라이프 사이클 단계 install설치 단계 전에 실행 단계 자체). 이는 다음 단계를 실행하는 것을 의미합니다.

  1. 확인
  2. 초기화
  3. 소스 생성
  4. 프로세스 소스
  5. 자원 생성
  6. 프로세스 자원
  7. 엮다
  8. 프로세스 클래스
  9. 테스트 소스 생성
  10. 프로세스 테스트 소스
  11. 테스트 리소스 생성
  12. 프로세스 테스트 리소스
  13. 테스트 컴파일
  14. 프로세스 테스트 클래스
  15. 테스트
  16. 패키지 준비
  17. 꾸러미
  18. 사전 통합 테스트
  19. 통합 테스트
  20. 통합 후 테스트
  21. 검증
  22. 설치

다른 낱말에서하는 수단 test뿐만 아니라 integration-test라이프 사이클 단계가 포함되어 있습니다. 따라서 추가 정보 없이는 원하는대로 동작을 변경할 수 없습니다.

Maven의 프로필을 사용하여 얻을 수 있습니다.

 <project>
  [...]
  <profiles>
    <profile>
      <id>no-unit-tests</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

따라서 첫 번째 요구 사항 :

  1. 을 실행하면 mvn install모든 테스트를 컴파일하고 싶지만 실행하고 싶지는 않습니다.

다음을 사용하여 얻을 수 있습니다.

mvn -Pno-unit-test test
  1. 을 실행하면 mvn test모든 테스트가 컴파일되지만 단위 테스트 만 실행됩니다.

이것은 일반 호출을 사용하여 간단히 달성 할 수 있습니다.

mvn test

통합 테스트 단계가 실행되지 않습니다 (빌드 수명주기 참조).

  1. mvn integration-test실행하면 모든 테스트를 컴파일하고 실행하고 싶습니다.

test, 단위 테스트 (maven-surefire-plugin)를 실행하는 단계를 실행하고 maven-failsafe-plugin에서 처리하는 통합 테스트를 실행하는 단계 를 포함하는 기본값을 실행하는 것을 의미합니다 . 그러나 통합 테스트를 호출하려면 다음 명령을 사용해야합니다.

mvn verify

대신 post-integration-test이전 통화에서 단계 를 놓쳤습니다 .

위와 별도로 단위 테스트 의 이름을 다음과 같이 지정해야하는 단위 및 통합 테스트의 명명 규칙을 따라야합니다 .

<includes>
 <include>**/*Test*.java</include>
 <include>**/*Test.java</include>
 <include>**/*TestCase.java</include>
</includes>

통합 테스트는 다음과 같은 이름을 지정해야합니다 :

<includes>
 <include>**/IT*.java</include>
 <include>**/*IT.java</include>
 <include>**/*ITCase.java</include>
</includes>

maven-failsafe-plugin을 올바른 수명주기 단계에 바인딩하는 데 필요한 다음과 같이 maven-failsafe-plugin을 구성했으면합니다.

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.15</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

올바르게했지만 include태그 가 컴파일 된 이름 ( .class)이 아닌 소스 코드 ( .java) 에서 작동 한다는 점을 알고 있어야합니다 . 범주 주석을 사용하지 않을 것입니다. 단순히 명명 규칙을 사용하면 pom이 더 간단하고 짧아집니다.


Failsafe Plugin 문서 에 따르면

mvn install -DskipITs

당신이 원하는 것입니다.


OP가 그의 질문에서 말한 것 :

mvn install 실행하면 모든 테스트를 컴파일하고 싶지만 실행하고 싶지는 않습니다. mvn test
실행하면 모든 테스트가 컴파일되지만 단위 테스트 만 실행됩니다. 내가 실행하면 MVN 통합 테스트를 , 나는 컴파일하고 모든 테스트를 실행합니다.

완벽하게 유효하고 달성하기 매우 쉽습니다.
편집 : 첫 번째 조건을 제외하고는 maven 성격을 다시 나타냅니다. 여기서 가장 좋은 방법은 간단하게mvn install -DskipTests

필요한 것은 다음의 스 니펫입니다 pom.xml.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.17</version>
    <executions>
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

and to stick to the maven naming conventions for unit and integration tests (as @khmarbaise already stated). So generally name you integration tests with IT suffix (for example MyIntegrationTestIT.java) and let maven-failsafe do its job.
In that way, you do not even need JUnit categories (although sometimes they can be quite useful).

That's it :)

  • mvn test executes only unit tests
  • mvn integration-test executes all tests
  • mvn failsafe:integration-test runs only integration tests
  • mvn clean verify when you want to be sure, that whole project just works


Some personal advices

Keeping integration tests separately from unit tests lets you easily run within your IDE all tests in some package. Usually additional directory called test-integration (or integrationtest) is used for this purpose.
This is also easy to achieve with maven:

<plugin>
    <!-- adding second test source directory (just for integration tests) -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
        <execution>
            <id>add-integration-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/test-integration/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

And then move your integration tests to that directory. It should look like:

src
   main
   test
   test-integration

Integration tests usually needs more memory:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
    </configuration>
</plugin>

This post explains how to skip integration tests, no matter what plugin you are using for these tests.

Basically, what you do is define a profile and put all your integration-tests related xml code inside that profile. Than you activate it when a property -DskipIntegrationTests is missing.

You can do the same for unit tests: write a profile and activate it when -DskipUnitTests is missing.

Then, you could do:

mvn install -DskipIntegrationTests -DskipUnitTests # (runs install without any tests)
mvn test # (runs unit tests)
mvn post-integration-test # (runs all tests)

The maven-failsafe-plugin docs has a section titled "Skipping by Default."

Sadly, the steps that page describes don't work as written. However, a slight change to those steps will make it work:

In the properties section of pom.xml, add this:

<skipITs>true</skipITs>

Then add the skipTests property to the plugin section of maven-failsafe-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <skipTests>${skipITs}</skipTests>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

So now, an mvn install by default will execute unit tests, but not integration tests.

But an mvn install -DskipITs=false will execute both unit tests and integration tests.

Footnote: Bad documentation played a big part on why Maven was so disliked for such a long time.


mvn test-compile does exactly what you are looking for. You can simply replace mvn install with mvn test-compile and you are done. No need to customise the pom file or anything. The below linked question is similar around #1:

Maven - How to compile tests without running them ?

mvn test-compile should be accepted as the best answer as Maven supports exactly what you want to do natively and without any magic. You would end up with this:

If I run mvn test-compile, I want all tests to compile, but I do not want to execute any.
If I run mvn test, I want all tests to compile, but execute only unit tests.
If I run mvn integration-test, I want to compile and execute all tests.

Don't specify the execution step(s) in the configuration of the failsafe plugin. E.g.

    <plugins>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>3.0.0-M3</version>
        </plugin>
    </plugins>

Now, you specifically need to call mvn failsafe:integration-test to run the integration tests; they will be skipped in other mvn targets.

ReferenceURL : https://stackoverflow.com/questions/17117589/how-can-i-skip-tests-in-maven-install-goal-while-running-them-in-maven-test-goa

반응형