2012-01-30 5 views
5

私は大きなプロジェクトにJUnitを追加しようとしており、テストスイートをネストするのが難しいです。たとえばA:いいえ、実行可能な方法: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結果を実行しているすべてのサブパッケージのテストスイート

でテストを実行します。これをどのように機能させるには?どこかで巨大なリストなしでテストを整理する良い方法はありますか?

+0

すべてのTest3で@RunWith(Suite.class)を削除し、見つからない注釈を追加するとTest2sの1つですべての問題が修正されました。しかし、これはそれを行うための最良の方法とは思われません。特定のディレクトリの下ですべてのテストを実行するより良い方法はありますか? – Spyder

答えて

5

最初の問題は、Test3はは@RunWith(Suite.class)を使用しますが、@Suite.SuiteClasses({Test3.class, .....})が含まれていないということです。これにより、IntializationError: class 'Test3' must have a SuiteClasses annotationが生成されます。 Test3の下にクラスがあることを意図していないので、この注釈は削除する必要があります。

Exception: No runnable methodsという2番目の問題は、ほとんどの場合、@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を見て、Antのために

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

::モジュールのすべてのJUnitテストを実行するには、POMに以下を追加し、Eclipse用の

<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にも同様の機能があります。