>source

나는 최근에이 매우 성가신 문제가 갑자기 나타났습니다. EclEmma 커버리지가 활성화 된 상태에서 단위 테스트를 실행하면 Eclipse에서 다음 대화 상자 창이 나타납니다.

검색 엔진의 경우 다음과 같습니다.

No coverage data has been collected during this coverage Session.
Please do not terminate the Java process manually from Eclipse.

내 프로젝트의 수업에 대한 커버리지 정보가 제공되지 않습니다. 말할 필요도없이 Java 프로세스를 수동으로 종료하지 않습니다. 그것을 시도하고 수정하기 위해 나는 프로젝트를 다시 가져오고, Java를 업그레이드하고, Emma를 다시 설치하고, Macbook Pro를 다시 시작하고, 임시 파일 시스템 공간이 좋아 보이는지 확인하고, 지금 당장 잊고있는 20 가지 다른 사항을 확인했습니다.

마침내이 오류를 생성하는 오픈 소스 프로젝트가 몇 개뿐이라는 것을 알게되었고 내 테스트 중 하나를 축소하기로 결정했습니다. 다음은 문제를 재현하는 최소 테스트입니다.

커버리지를 받으려는 테스트 클래스 :

public class Foo {
    public void method() {
        System.out.println("hello");
    }
}

이를 구동하는 junit 클래스는 다음과 같습니다.

public class EclEmmaFailureTest {
    @Test(timeout = 100000) // if you remove the timeout it works
    public void testStuff() {
        // this should cover Foo 100%
        new Foo().method();
        // if you comment this out stuff works
        org.apache.commons.logging.LogFactory.getLog(getClass());
    }
}

커먼즈 로그 Log 테스트에서 참조는 커버리지 컬렉션을 깨는 것 같습니다. 다음 위치에 작업 저장소를 게시했습니다.https://github.com/j256/eclemma-failure

다음 중 하나를 수행하면 문제가 사라집니다.

  • 주석 처리 LogFactory.getLog(getClass()) 요구.
  • junit 제거 @Test 제한 시간 필드.
  • Junit을 4.13.1에서 4.12로 다운 그레이드합니다.

저는 Emma 버전 3.1.3을 실행 중이며 테스트 프로그램은 commons-logging 버전 1.2에 따라 다릅니다.

이 문제를 해결하고 다시 작업하게하는 다운 그레이드 경로가 있지만 Junit 4.12에는 보안 문제가 있습니다. 누군가가 이것을 일으키는 junit 또는 emma의 특정 문제를 알고 있는지 궁금합니다.

Jacoco도 영향을 받는데 이는 놀라운 일이 아닙니다. 내 커버리지 보고서입니다Junit 4.13.1로 업그레이드하기 전에 80 % 커버리지를 보여주고 있습니다.이후 커버리지 정보없이 0 % 표시 가능.

감사.


  • 답변 # 1

    No coverage data has been collected during this coverage Session. Please do not terminate the Java process manually from Eclipse.

    이것은 버전 4.13에서 도입 된 스레드 그룹과 관련된 Junit 문제인 것 같습니다. 이 github 토론을 참조하고이 pull 요청을 참조하십시오. 타임 아웃이 설정되었을 때, Junit은 Eclemma에게 커버리지 정보를 쓸 기회를주지 않는 멈춘 스레드 문제를 처리하기 위해 스레드 그룹을 파괴 한 것 같습니다. 이 문제를 처리하는 더 좋은 방법으로 스레드 그룹을 데몬 스레드로 변경 한 것 같습니다.

    유일한 해결책은 4.13.1 이전 버전이 보안 문제를 겪고 있기 때문에 4.13.2가 출시 될 때까지 기다려야하는 것 같습니다.

    Looks like shutdown hooks are not executed the same way in 4.13 as it used to happen in 4.12 and thus the coverage failure.

    이에 대한 도움을 주신 Eclemma 메일 링리스트에 감사드립니다.

  • 답변 # 2

    여기에서는 EMMA가 사용되지 않습니다., 이름이EclEmma암시 할 수 있습니다. 사실 EclEmma는 2006 년 EMMA의 Eclipse 통합으로 시작되었습니다. 그러나 9 년 전, EclEmma 2.0 이후 EMMA는 EclEmma 팀이 만든 Java 용 무료 코드 커버리지 라이브러리 인 JaCoCo로 대체되었습니다.

    애플리케이션 및/또는 테스트의 코드 변경으로 인해 문제가 해결되기 때문에 커버리지 데이터가 수집되지만 표시되지 않을 가능성은 거의 없습니다. 따라서 남은 유일한 이유는JaCoCo를 방해하는 것이 있습니다.데이터 수집. JaCoCo의 FAQ에는 다음과 같은 이름이 있습니다.

    Why does a class show as not covered although it has been executed?

    First make sure execution data has been collected. For this select the Sessions link on the top right corner of the HTML report and check whether the class in question is listed. If it is listed but not linked the class at execution time is a different class file. Make sure you're using the exact same class file at runtime as for report generation. Note that some tools (e.g. EJB containers,mocking frameworks)might modify your class files at runtime. Please see the chapter aboutclass idsfor a detailed discussion.

    그것이 아닌지 확인하기 위해캐싱 문제, 사소한 코드 변경으로도 문제가 해결되는지 확인하십시오.

    문제를 해결하기 위해 나열하는 항목은 매우 다르지만 모두 타이밍에 영향을 미칠 수 있습니다.동시성 문제. 테스트 순서를 변경하거나 Thread.sleep() 어떤 곳에서 변화가 있는지 확인합니다.

    그러나 귀하의 경우에는근본 원인은최소한의재현 가능한 예(동시성 문제인 경우 제공하기 어려울 수 있음).

    최신 정보:

    밝혀진 바와 같이 근본 문제는 실제로 동시성입니다.JUnit 4.13.1의 문제(이전 버전의 JUnit은 영향을받지 않음) :

    JUnit 4 문제 # 1652 : 시간 초과 ThreadGroups를 폐기해서는 안됩니다.

    문제는 이미결정된JUnit 4.13.2해제.

관련 자료

  • 이전 java - JVM은 충분히 똑똑합니까?
  • 다음 레이블이 지정된 열을 넓은 형식에서 긴 형식으로 변환하고 레이블을 유지하는 방법은 무엇입니까? [아르 자형]