2012-06-13 4 views
1

maven 2에서 maven 3으로 전환 한 후 cobertura가보고 한 테스트 커버리지가 0 %임을 알게되었습니다. 나는 cobertura과 확실한 버전을 사용할지에 대한 질문 언급했습니다 : 나는, 그러나, 더 깊은 문제를 조사 하였다 What versions of cobertura and surefire plugins work together under maven3?Maven 3에서 cobertura와 확실한 forkMode는 결코 작동하지 않습니까?

및 작동하지 않는 구성 단편 무엇인지 발견에서 forkMode을 변경 한 후

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>${surefire.plugin.version}</version> 
      <configuration> 
       <forkMode>never</forkMode> 
       <redirectTestOutputToFile>true</redirectTestOutputToFile> 
       <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine> 
      </configuration> 
     </plugin> 

never ~ once 테스트 커버리지가 생성되기 시작했습니다. 그래서, 문제는 플러그인 버전의 비 호환성 자체가 아니라, Maven 3에서 cobertura에 의한 확실한 포크 모드에 의한 지원 문제였습니다.

제 질문은 버그 또는 cobertura 플러그인이 설계된 것입니다. 그런 식으로 어떤 것은 forkMode=never과 함께 작동하지 않을 것인가?

+0

왜 argLine을 forkMode = never로 지정하면 argLine은 무시됩니다. 너는 포크가 아니다. –

답변

1

Cobertura는 JVM이 종료 될 때 적용 결과를 출력하도록 설계되었습니다.

<forkMode>never</forkMode>은 테스트 실행을위한 JVM을 포크하지 않고 현재 JVM을 다시 사용하도록 지시합니다.

Maven이 실행을 완료 할 때까지 커버리지 결과가 출력되지 않을 수있다.

Maven 2에서는 100 % 확신 할 수는 없지만, cobertura 플러그인이 사용하는 forked lifecycle (악의적으로)이 fork 된 라이프 사이클의 JVM 포크를 일으키는 지, 아니면 클래스 로더가 효과적으로 언로드되었는지 같은 결과.

제 의견으로는 Maven 2의 버그로 <forkMode>never</forkMode>으로 작업 할 수있는 버그가있었습니다.

참고 :<forkMode>never</forkMode>은 시스템 등록 정보가 클래스 로더별로 범위 지정되지 않는 등의 이유로 매우 위험한 것으로 간주됩니다. <forkMode>once</forkMode>은 일반적으로 가장 좋은 옵션입니다 (메모리를 남용하는 테스트가없는 경우 - JUnit의 일부 버전은 실행 마지막에보고 할 때까지 메모리에 모든 테스트 클래스 인스턴스를 유지하므로 각 테스트 클래스가 무거운 객체를 보유하는 경우 GC가 그런 경우에는 perclass/항상 forkMode가 필요합니다)