2010-12-16 2 views
7

제 질문은 Ant 빌드 파일에 테스트가 끝나고 스스로 정리할 수있는 부분이없는 것입니다. 세부 사항은 아래와 같습니다.내 JUnit 테스트는 Eclipse에서 실행될 때 작동하지만 Ant를 통해 무작위로 실패하는 경우

Eclipse를 통해 실행할 때 항상 통과하는 테스트 세트가 있지만 Ant 빌드를 사용하여 실행하면 때때로 통과하거나 실패합니다. 테스트에서는 JOCL을 통해 openCL을 사용하므로 GPU에서 메모리가 제한되어 있으므로 올바르게 관리해야합니다. 내 출력에서 ​​때때로 내 Ant 빌드를 실행할 때 얻을 수 있습니다.

[junit]  Caused an ERROR 
[junit] CL_MEM_OBJECT_ALLOCATION_FAILURE 
[junit] org.jocl.CLException: CL_MEM_OBJECT_ALLOCATION_FAILURE 

문제는 테스트 자체 일 수 없습니다. 내 기억이 가장 배가 고픈 테스트가 스위트 끝에서 시작되었다고 생각합니다. 이 마지막 테스트가 호출 될 때, 어떻게 든 GPU는 이전 테스트의 나쁜 상태로 남습니다. 이클립스를 통해 테스트를 실행할 때 이것은 발생하지 않습니다. 배가 고프린 메모리 테스트를 스위트에서 첫 번째 테스트로 만들면 앤트 빌드에서 실패한 적이 없습니다. 이것은 친숙한 사건입니까? Eclipse를 통해 테스트를 실행하는 것이 항상 효과가있는 이유는 무엇입니까? 내가 시도할만한 것이 있습니까? 여기

내 Ant 빌드에서 테스트 대상 :

<target name="test" if="testing.enabled"> 
    <mkdir dir="${test.bin.dir}" /> 
    <javac srcdir="test" destdir="${test.bin.dir}" debug="true" classpathref="testclasspath" source="1.6"/> 
    <junit haltonerror="true" haltonfailure="true"> 
     <classpath refid="testclasspath"/> 
     <formatter type="plain" usefile="false" /> 
     <batchtest> 
      <fileset dir="test"> 
       <include name="*Test.java"/> 
      </fileset> 
     </batchtest> 
    </junit> 
</target> 

답변

5

코드에서 왼쪽의 정리를 놓친 적이 없다면 JUnit 테스트 슈트를 만들어 eclipse와 ant에서 실행할 수 있습니다. 테스트 스위트를 작성하면 Eclipse (프로젝트 내의 순서?)와 ant (파일 시스템의 순서?)의 순서에 상관없이 스스로를 사용하고 두 경우 모두 순서를 결정할 수 있습니다.

코드가 문제가 없다고 확신하지 못하면 테스트 클래스 목록에서 Collections.shuffle()을 호출하여 시작하는 테스트 슈트를 만들 수 있습니다. 두 테스트에서 모두 알 수없는 테스트 실행 순서를 소개합니다. 실패.

0

Let me google that for you:

개미는 자바 매개 변수를 설정하기 위해 사용하는 것입니다 ANT_OPTS라는 환경 변수를 찾습니다. > 환경 변수를 설정하면됩니다.

수출 ANT_OPTS = -Xmx256m 이클립스 withing에 실행하는 경우

는, 대부분 (그리고 따라서 개미) JVM이 이미 기본보다 더 많은 메모리를 가지고 : 그래서 나는하여> 힙 크기를 증가시키기 위해 다음과 같은 추가했다.

+0

이 문제는 해결되지 않습니다. 나는 그것을 시도했지만, 256mb와 같은 적은 양의 메모리에서 메모리 공간 유형 오류로 인해 Java 힙이 발생했다. 메모리를 512MB 또는 1024MB로 늘리면 GPU에서 발생하는 메모리 할당 오류가 발생했습니다. 내 문제는 JUnit이 하나의 개별 JUnit 테스트의 실제 메모리 사용이 아니라 스위트 내에서 JUnit 테스트를 닫고 열어가는 방식에 있다고 생각합니다. Ant 빌드에서는 각 테스트가 자체적으로 실행되는 경우 항상 통과합니다. – smuggledPancakes

+1

다른 방법으로 문제가 발생할 수 있습니까? 나는. 웬일인지 테스트는 가비지 콜렉션에 달려 있으며 Eclipse GC에서는 발생하지만 개미에서는 발생하지 않습니다 –

+0

왜 이런 일이 발생했는지에 대한 아이디어가 있습니까? 나는 또한 내가 물건을 어슬렁 거리게하지 않을 것이라고 확신한다. 내 JUnit 테스트에는 전역 필드가 사용되지 않고 테스트가 끝나면 모든 것이 범위를 벗어납니다. 나는 gc와 클린업과 관련이 있을지도 모르는 개미 설정을 위해 인터넷 검색을 시도했지만 여전히 붙어있다. – smuggledPancakes

3

테스트 사례에서 메모리를 확보하지 못하는 것이 문제 일 수 있습니다. JUnit은 시작될 때 모든 테스트 클래스를 초기화 한 다음 실행합니다. 테스트 클래스의 객체를 참조하는 필드가있는 경우 을 tearDown() 메소드에 할당하지 않으면 모든 필드가 전체 테스트 실행을 통해 할당 된 상태로 유지됩니다. 예를 들면 다음과 같습니다.

class Test extends TestCase { 

    private Data data; 

    public void setUp() { 
     data = new Data(); 
    } 

    public void tearDown() { 
     data = null; // required to allow garbage collection of the Data object 
    } 

} 

아마도 이클립스는 실행 된 후에 테스트 인스턴스를 참조 해제하여 필드를 가비지 수집 할 수 있습니다. 그러나 표준 JUnit TestRunner를 사용하면 더 이상 사용되지 않지만 여전히 참조되는 모든 객체를 사용하여 많은 객체를 처리하게됩니다.

2

테스트가 Eclipse를 통과하고 다른 곳에서 실패하는 경우 많은 종류의 개발자 증후군 중 하나에 시달리고 있습니다. "...하지만 여기에서 실행할 때 작동합니다 ...!"

당신은 당신이 당신의 코드와 함께 작업 할 수 이클립스를 구성하는 관리 한 기능은에, 아직 코드가 수행되지 것 즉, 여기까지, 배포 할 수 없습니다. 잠시 동안

보류 이클립스 다른 컴퓨터에서도 코드를 사용해보십시오!

그런 다음 이클립스로 돌아가서 위의 과정을 반복 할 때까지 (예를 들어 비난하지 말고) 명령 행으로 넘어가거나 다른 IDE를 사용하십시오. 이클립스 나 하드 디스크/설정에 대한 의존성이 제거되었다는 것을 확신 할 수 있습니다. 결국 코드는 누가 알고있는 서버에서 실행될 수 있어야합니다.

다른 컴퓨터에 설치된 깔끔한 Eclipse 설치로 코드의 소스 전용 스냅 샷을 만들려고 했습니까? 좋은 설정 관리 테스트가 될 것이므로 코드가 그대로 전달되지는 않을 것이라고 확신합니다.

Eclipse가 깨끗한 (가상) 머신에서 마술을하기 위해 진지하게 노력하십시오. 첫 번째 실행에서는 작동하지 않지만 설치 환경에서 작동하게 만들었던 것을 배우게됩니다.

관련 문제