2010-02-18 2 views
16

Maven surefire 플러그인이 기본적으로 멀티 스레드 테스트를 실행하는지 (그리고 가능한 경우 스레드 수를 제어 할 수 있습니까?) 테스트 클래스에서 임의의 순서 또는 예측 가능한 순서로 테스트를 실행하는지 궁금합니다. 명령이 어떤 수단에 의해 지시 될 수 있다면.Maven surefire 플러그인은 다중 스레드를 사용하여 테스트를 실행합니까?

아직 확인하지는 않았지만 (이 시점에서 지침과 검증을 위해 머리를 찾고 있습니다.) 여러 JUnit 테스트 클래스가 일부 혼합 된 상태로 테스트를 실행하는 것처럼 보입니다. 주문. 그래서 테스트 리소스를 만드는 것을 조율하는 것이 정말 고통 스럽습니다. (제 경우에는 꽤 무거울 것입니다).

Eclipse JUnit 러너를 사용하여 스위트를 실행하면 모든 것이 매우 선형 적으로 실행되어 멋지게 작동합니다. 나는 Maven cmd line으로 가고 모든 것들은 서로 밟고있는 것처럼 보인다.

답변

13

기본적으로 Maven은 별도의 ("분기 된") 프로세스로 테스트를 실행하며, 더 이상은이 매개 변수를 forkMode 선택적 매개 변수를 사용하여 제어 할 수 있습니다.

당신이 TestNG를 또는 Junit와를 사용하는 경우 4.7+ ( SUREFIRE-555 때문에),이 병렬로 테스트를 실행합니다 (parallelthreadCount 선택적 매개 변수를 참조) 할 수 있지만 그 기본이 아니다.

TestSuite suite= new TestSuite(); 
suite.addTest(new MathTest("testAdd")); 
suite.addTest(new MathTest("testDivideByZero")); 
: 이제

, 나는 확실한 플러그인의 JUnit과 동일하게 동작합니다 있는지 확실하지 않습니다 동안, 수동으로 TestSuite을 작성하여 약간의 제어를 얻을 테스트가 실행되는 순서를 지정할 수 있습니다

그러나 테스트 실행 순서에 의존하지 말 것을 강력히 권장합니다. 단위 테스트는 실제로 독립적이어야합니다.

추신 : 투표 할 수도있는이 요청 SUREFIRE-321 (알파벳 순서로 테스트 실행)이 있습니다.

+0

안녕하세요, 양방향 테스트를 피하고 거기에 도달하려고 노력 중입니다 ... 두 가지 문제에 투표했습니다. 555는 2.5 릴리스의 일부로 보입니다. http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.5/. – harschware

+0

OOM과 관련된 문제에 직면하고 싶지 않을 경우를 대비하여 surefire 플러그인 버전 2.4.2 이상을 사용하십시오 –

3

먼저 단위 테스트 은 서로 독립적이어야합니다. 이것은 실행 순서가 JUnit조차도 보장되지 않기 때문에 각 테스트는 전후에 관계없이 각 컨텍스트 (테스트 픽스처라고도 함)를 설정하고 해체해야합니다.

실행 순서는 (I는 알파벳 순서를 추측 것) 같은 경향의 JUnit에서,하지만 확실히 임의 아니지만, 당신은 거기에 있지 빌드한다 - 그것은 언제든지 변경, 분명히 확실한의 수 주문이 다릅니다.

다음은 왜 interacting tests이 좋은 아이디어가 아닌지에 대한 좋은 링크입니다.

+0

안녕을 추가하여 0으로 forkCount을 강제 할 수 거기에 도착하기 ... 조언과 링크에 감사드립니다. – harschware

2

JUnit은 테스트를 .java 파일에 표시된 순서대로 (알파벳 순서가 아닌) 실행합니다. Maven-surefire는 다른 순서로 실행하지만 예측할 수는 없습니다 (내가 알 수있는 한).

이상적으로 테스트는 서로 독립적이지만, 싱글 톤과 정적 컨텍스트는 상황을 복잡하게 만들 수 있습니다. 별도의 TestCase (개별 테스트가 아닌)의 실행 사이에 새로운 정적 컨텍스트를 가져 오는 유용한 방법은 pom.xml에 forkMode 변수를 설정하는 것입니다.

<forkMode> 항상 </forkMode 나는 당신이 당신 받는다는 명령에 -T 옵션을 사용하는 경우, 확실한 다음 동시 프로세스의 forkCount * <specified number of threads by the -T option> 수에 포크 것을 발견했다 >

0

.

가 -T로 지정된 다중 스레드를에도 불구하고 그들에게 하나 개의 프로세스의 모든 실행하려면, 당신은 노력, 대화 형 테스트를 피하는 인식 옵션 -Dsurefire.forkCount = 0

관련 문제