2016-10-28 3 views
7

私はBaseTestと呼ばれるベーステストクラスを拡張するJUnitテストの束を持っていて、それはAssertにも及んでいます。私のテストの中には@Category(SlowTests.class)注釈があります。Junitでカテゴリを使用するときにカスタムランナーを使用するにはどうすればよいですか?

私のBaseTestクラスには、次の注釈@RunWith(MyJUnitRunner.class)が注釈されています。

SlowTestsだけ実行されると予想されるGradleタスクをセットアップしました。

task integrationTests(type: Test) { 
    minHeapSize = "768m" 
    maxHeapSize = "1024m" 
    testLogging { 
     events "passed", "skipped", "failed" 
     outputs.upToDateWhen {false} 
    } 
    reports.junitXml.destination = "$buildDir/test-result" 
    useJUnit { 
     includeCategories 'testutils.SlowTests' 
    } 
} 

私のタスクを実行すると、私のテストは実行されません。この問題は、BaseTestのカスタムランナーMyJUnitRunnerに関連していると特定しました。 Suiteを使用している間にカスタムランナーを使用できるように、どのように私のGradleまたはテスト構造をセットアップできますか?

+0

ランナー、サンプルテスト、またはBaseTestを投稿した場合に役立つと思います。カテゴリーランナーにとってはうまくいくのですか? – MrKiller21

+0

@ MrKiller21私は私の答えを編集しました。下記を参照してください。 –

答えて

3

これに対する解決策は、私が思っていたよりも小さくて厄介であることが判明しました。 Gradleは私のカスタムテストランナーを使って、filterメソッドを正しく呼び出していました。しかし、私のランナーは、Javaassistの拡張機能のために、すべてのテストクラスを独自のクラスローダーを通してリロードします。

これは、SlowTest注釈がGradleクラスローダーを介して読み込まれたが、カスタムランナーに渡されたときにランナーはその注釈で注釈が付けられたかどうかを確認した。 2つの異なるクラスローダーを介してロードされたSlowTestアノテーションの等価性が異なるため、このチェックは正しく解決されませんでした。

-

私はすでに、研究を行ってきたので、私はここにこれを残しておきます。 Gradleと(潜在的な)JUnitソースを掘り起こした後、ここに私が持っているものがあります。

Gradleは、テストの分類以外の高度なJUnit機能を処理しません。インクルードカテゴリまたは除外カテゴリ条件を使用してGradleタスクを作成すると、CategoryFilterが作成されます。ご存じない場合は、Filterは、JUnitがテストランナーにテストまたはテスト方法を除外するかどうかを決定するためのものです。テストランナーはFilterableインターフェイスを実装する必要があります。

JUnitには複数のランナーが付属していますが、Categoriesはもう1つです。それはSuiteと呼ばれるテストランナーの家族を拡張します。これらのスイートベースのランナーは、一連のテストを実行するように設計されています。一連のテストは、スイート内でテストを明示的に定義することによって、または一連のテストを構築するその他の方法によって、注釈イントロスペクションによって構築できます。

Categoriesランナーの場合、JUnitは独自のCategoryFilterですが、Gradleはそれを使用せず、それ自身のCategoryFilterを使用します。両方とも、多かれ少なかれ同じ機能を提供し、Filterableを実装するスイートで使用できるようにJUnitフィルタです。

JUnitテストを実行するための実際のクラスはJUnitTestClassExecuterです。コマンドラインオプションを解析したら、JUnitにランナーの確認を要求してテストに使用する必要があります。このメソッドは、hereのように、すべてのテストで呼び出されます。

残りは単にJUnitまでです。 Gradleはテスト結果を表す標準XMLファイルを生成するためにカスタムRunNotifierを作成しました。

誰かがこの点を発見し、無限のデバッグ時間を救ってくれることを願っています。

TLDR:任意のランナーをGradleで使用できます。 Gradleにはランナーに関する詳細はありません。ランナーを決めるのはJUnitです。ランナーがテストに使用されるかどうかを知りたい場合は、 Request.aClass(testClass).getRunner()を呼び出すことでこれをデバッグすることができます。あなたのコードベースのどこかでこれをハックし、コンソールに出力してください。 (私はGradleにデバッガを接続するのにはあまり成功しませんでした)

関連する問題