2012-01-30 4 views
5

큰 프로젝트에 JUnit을 추가하려고하고 테스트 스위트를 중첩하는 데 어려움을 겪고 있습니다. 예를 들어 실행 가능한 방법 :JUnit 4.x에서 중첩 된 TestSuites는 어떻게 생성합니까?

@RunWith(Suite.class) 
@Suite.SuiteClasses({Test2.class, .....}) 
public class Test1{ 
} 

@RunWith(Suite.class) 
@Suite.SuiteClasses({Test3.class, .....}) 
public class Test2{ 
    //might have tests 
} 

@RunWith(Suite.class) 
public class Test3{ 
    //tests here 
} 

각 클래스는 의 java.lang.Exception에서 Test1을 결과를 실행 그 자체 패키지 테스트뿐만 아니라 모든 하위 패키지 TestSuites

를 실행합니다. 어떻게 작동 시키나요? 엄청난 목록없이 어딘가에 테스트를 구성하는 더 좋은 방법이 있습니까?

+0

모든 Test3에서 @RunWith (Suite.class)를 제거하고 누락 된 주석을 추가하여 Test2s 중 하나가 모든 문제를 해결했습니다. 그러나 이것은 ike가 그것을하는 제일 방법 인 것처럼 보이지 않는다. 특정 디렉토리에서 모든 테스트를 실행하는 더 좋은 방법이 있습니까? – Spyder

답변

5

첫 번째 문제점은 Test3이 @RunWith(Suite.class)을 사용하지만 @Suite.SuiteClasses({Test3.class, .....})을 포함하지 않는다는 것입니다. 그러면 IntializationError: class 'Test3' must have a SuiteClasses annotation가 생성됩니다. Test3 아래에 어떤 클래스도 존재하지 않으므로이 주석을 제거해야합니다.

Exception: No runnable methods의 두 번째 문제점은 거의 항상 @Test을 추가하는 것을 잊어서 발생합니다. 샘플에 테스트를 넣지 않았으므로 사실인지 아닌지는 모르겠지만 가능성이 가장 높습니다.

Test1.java

import org.junit.runner.*; 
import org.junit.runners.*; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({Test2.class}) 
public class Test1 { 

} 

Test2.java

import org.junit.runner.*; 
import org.junit.runners.*; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({Test3.class}) 
public class Test2 { 

} 
을 :

다음 테스트는 모든 클래스에서 실행 할 수 있습니다 코드의 작업 버전입니다

Test3.java

import static org.junit.Assert.*; 

import org.junit.*; 

public class Test3 { 

    @Test 
    public void testTrue(){ 
     assertTrue(true); 
    } 
} 

물건을 구성하는 것보다 더 좋은 방법이 있는지 여부는 클래스를 만드는 방법에 따라 달라집니다. 스위트에 스위트를 추가 할 수 있기 때문에 이것이 보여주는 것처럼 나무 같은 모든 것에 의존하는 스위트 룸을 더 작게 만들 수 있습니다. 예를 들어 내가 일반적으로하는 일은 다음과 같습니다.

AllTestSuite 
    TextParsingSuite 
    GuiSuite 
     SwingSuite 
     JavaFXSuite 
    FileIOSuite 

테스트는 가장 관련있는 제품군에 추가됩니다. 결국 나는 10 개 이상의 테스트 클래스/스위트를 가진 스위트가 없다고 생각합니다. 그렇게한다면 새로운 하위 제품군을 만들 차례입니다. 다른 말로하면 "거대한리스트 어딘가"가 존재하지 않고 하나의 큰리스트를 효과적으로 만들기 위해 더 작은리스트가 다른리스트로 결합되어 있습니다.

일부 도구를 사용하여 테스트가 포함 된 모든 Java 클래스를 동적으로 찾을 수 있지만 JUnit 자체는이 동작을 지원하지 않습니다 (개인적으로 좋은 것으로 생각되는 테스트 만 실행합니다).).

0

필자는 개인적으로 maven/ant/Eclipse를 사용하여 일련의 테스트를 실행합니다.

maven을 사용하는 경우 surefire을 확인하십시오. JUnit task 보면, 개미를 들어

<build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.11</version> 
     </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

: 모듈에 대한 모든 JUnit 테스트를 실행하려면 치어에 다음을 추가, 이클립스를 들어

<junit printsummary="yes" haltonfailure="yes"> 
    <classpath> 
    <pathelement location="${build.tests}"/> 
    <pathelement path="${java.class.path}"/> 
    </classpath> 

    <formatter type="plain"/> 

    <test name="my.test.TestCase" haltonfailure="no" outfile="result"> 
    <formatter type="xml"/> 
    </test> 

    <batchtest fork="yes" todir="${reports.tests}"> 
    <fileset dir="${src.tests}"> 
     <include name="**/*Test*.java"/> 
     <exclude name="**/AllTests.java"/> 
    </fileset> 
    </batchtest> 
</junit> 

바로 패키지를 클릭하고 '실행을 선택합니다 JUnit으로. 그러면 해당 패키지에서 찾을 수있는 모든 테스트가 실행됩니다. Intellij에는 비슷한 기능이 있습니다.