Maven에서 단위 테스트는 방지하지만 통합 테스트는 허용


157

SureFire 플러그인을 사용하여 일부 단위 테스트를 실행하고 FailSafe 플러그인을 사용하여 일부 통합 테스트를 실행하는 Maven 빌드가 있습니다. FailSafe 플러그인의 테스트를 실행하는 방법을 원합니다.

멀티 모듈 빌드이므로 모든 모듈의 pom을 편집하고 싶지 않기 때문에 pom에 다른 프로파일이나 다른 것을 추가하는 것은 좋은 해결책이 아닙니다.

있다 skip.testsmaven.test.skipskipTests중지하는 모든 테스트를하고,skipITs 단지 안전 장치 플러그인 멈추는.

Maven과 같은 명령 줄 플래그가 skipITs있지만 대신 "onlyITs"의 기능이 있습니까?


당신은 시도 했 maven.test.skipskipTests?
Thomas

1
이론적으로 @khmarbaise, 그렇습니다. 그러나 대부분의 프로젝트에서 실제로 작업 한 "단위 테스트"에서 실제로 메모리 내 DB와의 통합 테스트 (운이 좋으면)
Sean Patrick Floyd

9
@khmarbaise 많은 단위 테스트. 실행하는 데 몇 분이 걸리며이 상황에서 실행할 필요는 없습니다. 특히 아티팩트를 빌드하기 전에 단위 테스트를 실행하지만 여러 환경에서 IT를 실행하려고합니다. 이 시점에서 유닛 테스트를 다시 실행하는 지점이 없습니다.
매튜 길 리아드

2
안녕 @khmarbaise, 내 설정 skipTests에서 failsafe 테스트가 아닌 확실한 테스트 만 건너 뜁니다! 어쩌면 새로운 기능일까요?
danidemi

2
참고 : skipTests 이제 (3.0.0-M3 안전 장치 플러그인에서 더 이상 사용되지 않습니다 확실한-1611 )
기욤 Husta

답변:


170

확실한 테스트 만 건너 뛰는 가장 간단한 방법 은 다음과 같이 surefire를 구성하는 것입니다 ( 그러나 failsafe는 아님).

<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실제로 maven 빌드를 실패 하는 데 필요한 목표를 실행합니다 .

이것은 테스트를 건너 뛰도록 지정하는 데 사용되는 속성을 재정의하므로, 표준을 제공하면 -DskipTests=true확실한 것은 무시하지만 비상 안전은 그것을 무시합니다. 특히 플래그를 이미 지정하는 기존 빌드 / 사용자가있는 경우 예기치 않은 결과가 발생할 수 있습니다. 간단한 해결 방법은 기본값 것 같다 skip.surefire.tests의 값으로 skipTests당신의 <properties>POM을 섹션 :

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

필요한 경우, skip.failsafe.tests안전 장치 (failsafe) 라고하는 analagous 매개 변수를 제공 할 수는 있지만, 필요하지 않습니다. 단위 테스트는 일반적으로 초기 단계에서 실행되기 때문에 단위 테스트는 실행하지만 통합 테스트는 실행하지 않으려면 실행합니다. test대신의 단계 verify단계입니다. 당신의 경험은 다를 수 있습니다!

이러한 skip.(surefire|failsafe).tests속성은 아마도 firefire / failsafe 코드 자체에 통합되어야하지만 "1 개의 작은 차이를 제외하고는 정확히 동일한 플러그인"정신을 위반하는 것이 확실하지 않습니다.


4
이 솔루션을 사용하여 -DskipUnitTests가 확실한 플러그인을 건너 뛰고 -DskipIntegrationTests는 안전 장치 플러그인을 건너 뛰고 DskipTests는 둘 다 건너 뛰도록 프레임 워크를 설정할 수있었습니다. 정확히 무엇이 필요했습니다!
Alex Jansen

2
내 IDE 대해 불평 "할 수 없습니다 해결 기호 'skipTests'"솔루션 라인이 추가되었다 <skipTests>false</skipTests>여전히 명령 줄 인수는 덮어 쓰기 속성에 보이는대로 -DskipTests 또는 -Dskip.surefire.tests의 조합으로 작동 stackoverflow.com/questions/13708738 /… 솔루션에 추가하고 싶을 수도 있습니다
globalworming

<skipTests>${skip.surefire.tests}</skipTests>maven-surefire-pluginversion에서 작동하지 않습니다 3.0.0-M3. 모든 확실한 테스트가 여전히 실행 중입니다. 다른 사람이 이것을 찾았습니까? 아래의 Sean Patrick Floyd 솔루션이 작동합니다.
존 메이어

120

해결 방법은 다음과 같습니다.

mvn clean test-compile failsafe:integration-test

틀림없이 이것은 추악하지만 문제를 해결할 수 있습니다.


또는 (또 다른 핵) :

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

참고:


1
두 번째 제안은 나를 위해 일했습니다. 사전 통합 테스트가 성공적으로 호출되었습니다
Lawrence Tierney

7
이것이 좋은 생각입니까? 통합 테스트가 실패하더라도 빌드 결과가 성공적이지 않습니까? 즉, 안전 장치의 전체 본질의 당신이하지 않는 경우 '확인'목표를 실행합니다 . 인용문 : "Failsafe 플러그인은 통합 테스트 단계에서 빌드에 실패하지 않습니다". 통합 테스트의 성공 여부를 실제로 확인하려면 확인 목표를 실행해야합니다!
bacar

2
@bacar가 맞지만 두 번째 솔루션 verify대신 사용 integration-test하십시오.
Matthew Gilliard

1
실제로 더 나은 솔루션을 얻으려면 @bacar 답변을 참조하십시오.
FBB

12
failsafe:verify첫 번째 핵 ( mvn clean test-compile failsafe:integration-test failsafe:verify) 의 끝에 추가 하면 통합 테스트 중 하나가 실패하면 빌드가 실패합니다.
Shadow Man

73

Antonio Goncalves Blog 의 코드를 사용하고 있으며 완벽하게 작동합니다.

다음과 같은 속성을 사용할 수 있습니다.

-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
고마워, 좋은 접근 방식! surefire (default-test)의 기본 실행을 무시하는 것도 유용합니다. stackoverflow.com/questions/11935181/…
pls

1
이것이 때때로 때때로 아래로 스크롤하여 필요한 모든 정보가 포함 된 훌륭한 작업 솔루션을 찾아야하는 이유입니다. 공유해 주셔서 감사합니다
Atul Chaudhary

정말 좋은 해결책입니다. 그러나 비상 안전 구성은 skipITs기본값으로 중복됩니다 .
timomeinen

SkipITs는이 구성에서 사용자 정의 옵션입니다. 기본 구현에서는 옳았지만 OP 질문은 아닙니다.
Martijn Burger

Kudos, 당신은 maven 전문가입니다! 이것은 maven 수퍼 폼에 있어야합니다.
Adam

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
이것은 가장 쉬운 (그리고 솔직히 가장 뛰어난) 솔루션입니다!
Titulum

OP가 요청한대로 표시된대로 모든 단계를 실행하므로 pom에 아무것도 추가하지 않아도됩니다. 좋은 대답입니다.
jnichols959

1

@danidemi 및 @GuillaumeHusta의 의견을 확장하려면 :

참고 : skipTests는 Failsafe Plugin 3.0.0-M3에서 더 이상 사용되지 않습니다 ( SUREFIRE-1611 ).

따라서 통합 테스트가 아닌 단위 테스트를 건너 뛰려면 최신 버전의 Failsafe 플러그인을 사용하는 경우이 작업을 수행 할 수 있습니다.

mvn verify -DskipTests

(이것이 도움이된다면 언급 된 의견을 공감하십시오)


-3

별도의 프로파일에서 통합 또는 단위 테스트를 실행하십시오. 그런 다음 프로필을 활성화 / 비활성화 할 수 있습니다.


IT 만 실행하는 프로파일을 정의하는 상위 pom을 추가 할 수 있습니까? 모든 프로젝트 하위 모듈은 해당 pom 형식을 상속 할 수 있으므로 속성이 없을 때 프로파일을 활성화 할 수 있으므로 모든 pom을 변경하거나 특수 스위치로 모듈을 실행할 필요가 없습니다.
yoosiba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.