2009-05-03 31 views
32

JUnitでテストをグループ化する方法はありますか?そのため、いくつかのグループのみを実行できますか?JUnitテストのグループ化

または、いくつかのテストに注釈を付けてからグローバルに無効にすることはできますか?

私はを使用しています。JUnit 4、私はTestNGを使用できません。

編集: @RunWithと@SuiteClassesはうまくいきます。しかし、テストクラスでこれだけのような注釈を付けることは可能ですか?あるいは、テストクラス全体に注釈を付ける必要がありますか?

+0

関連:http://stackoverflow.com/questions/457276/junit4-test-suites/4952225#4952225 – cmcginty

+0

'@ RunWith'と' @ SuiteClasses'はあまり良くありません。http:// stackoverflowを見てください。コム/質問/ 18894951 – Val

+0

IMHO、第二の答えは受け入れ答えなければなりません - JUnitの4.8 – Srikanth

答えて

9

テストクラス内でテストをグループ化するか、テストクラスをグループ化しますか?私は後者を仮定しようとしています。

テストの実行方法によって異なります。 Mavenでそれらを実行する場合は、含めるテストを正確に指定することができます。これについてはthe Maven surefire documentationを参照してください。

さらに一般的には、私はテストスイートのツリーを持っているということです。

@RunWith(Suite.class) 
@SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class) 
public class UnitTestsSuite { 
} 

だから、多分私はFunctionTestsSuiteとUnitTestsSuite、その後、他の二つを含んAllTestsSuiteを持っている:JUnitの4のテストスイートは、のようになります。 Eclipseでそれらを実行すると、非常に素晴らしい階層表示が得られます。

このアプローチの問題点は、複数の異なる方法でテストをスライスしたい場合は面倒です。しかし、それはまだ可能です(たとえば、モジュールに基づいてスライスされたスイートを1セット、次にテストのタイプを別のスライスにすることができます)。

+5

構文を使用していたので、公式のグループ化のサポート:次の@SuiteClasses({SomeUnitTest1.class、SomeUnitTest2.class}) –

+0

@MatthewHegartyのおかげで、しかししてください、あなたがコード自体の誤植に気付いたら、編集を躊躇しないでください。コメントはコメントとして投稿しないでください(コメントは他のコメントの流入によって埋められる可能性があります)。本当にコミュニティにとっては役に立たないものです。ありがとう! –

1

テストグループを含むテストSuiteオブジェクトを作成できます。あるいは、IDEのように(Eclipseのように)、特定のパッケージに含まれているすべてのテストを実行することができます。

8

グローバルに無効にするために、JUnit(4.5+)には2つの方法があります.1つは新しいメソッドassumThatを使用することです。それをテストクラスの@BeforeClass(または@Before)に入れ、条件が失敗した場合はテストを無視します。条件では、グローバルにオンまたはオフに設定できるシステムプロパティなどを配置できます。

また、グローバルプロパティを理解し、適切なランナーに委任するカスタムランナーを作成することもできます。このアプローチは(JUnit4の内部ランナーは不安定で、リリースごとに変更できるので)はるかに脆弱ですが、クラス階層を継承してサブクラスでオーバーライドできるという利点があります。これは、従来のJUnit38クラスをサポートする必要がある場合にこれを行う唯一の現実的な方法です。

カスタムランナーを行うためのコードです。 getAppropriateRunnerForClassが何をするかに関して、私が実装した方法は、カスタムランナーに何を実行するかを伝える別々のアノテーションを持たせることでした。唯一の選択肢は、JUnitコードからの非常に脆いコピーペーストでした。

private class CustomRunner implements Runner 
private Runner runner; 

    public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable { 
     if (!isRunCustomTests()) { 
      runner = new IgnoredClassRunner(klass); 
     } else { 
      runner = getAppropriateRunnerForClass(klass, builder); 
    } 

    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void run(RunNotifier notifier) { 
     runner.run(notifier); 
    } 
} 

編集:@RunWithタグは、クラス全体でのみ動作します。その制限を回避する1つの方法は、テストメソッドを静的な内部クラスに移動し、それに注釈を付けることです。そうすれば、クラスの構成にアノテーションの利点があります。しかし、これを行うと@Beforeタグや@BeforeClassタグは役に立ちません。内部クラスのタグを再作成する必要があります。外部クラスのメソッドを呼び出すことはできますが、独自のメソッドをフックとして持つ必要があります。グループ化

71

のJUnit 4.8サポート:

public interface SlowTests {} 
public interface IntegrationTests extends SlowTests {} 
public interface PerformanceTests extends SlowTests {} 

そして...

public class AccountTest { 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeSomeTime() { 
     ... 
    } 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeEvenLonger() { 
     ... 
    } 

    @Test 
    public void thisOneIsRealFast() { 
     ... 
    } 
} 

そして最後に、ここから撮影、

@RunWith(Categories.class) 
@ExcludeCategory(SlowTests.class) 
@SuiteClasses({ AccountTest.class, ClientTest.class }) 
public class UnitTestSuite {} 

:またhttp://weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-categories-0

、Arquillianそれ自己支持グループ: https://github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/Categories.java

3

お試しJUnit Test Groups

  • -Dtestgroup =グループ1、グループ2
  • すべてのテストグループを実行します:-Dtestgroup =統合
  • 複数のテストグループを実行します。実行し、簡単なテストグループが

    @TestGroup("integration") 
    public class MyIntegrationTest { 
        @ClassRule 
        public static TestGroupRule rule = new TestGroupRule(); 
    
        ... 
    } 
    
    • :ドキュメントから-Dtestgroup =すべて