2016-07-02 8 views
2

問題
を収集し、(ない方法で、クラスによって並列化)独自のJVM内の各テストクラスと並行して、すべてのJUnitテストを実行しますJUnitParamsRunner)はすべてルートパッケージtests(さまざまな深さのtestsのさまざまなサブパッケージにあります)の下にあります。私は、このようなPowerMockRunnerかなどのカスタムランナーを持つ多くのJUnitテスト(の束をしました

私はパッケージtestsの下にすべてのテストを収集し、並行して、別のJVMで各テストクラスを実行したいと思います。理想的には、並列化は設定可能ですが、デフォルトのnumber_of_coresも同様に完全です。私は独自のJVMで各メソッドを実行するのではなく、各クラスを実行したいと考えています。

背景
私は私のテストの多くの注釈@RunWith(PowerMockRunner.class)@PowerMockRunnerDelegate(JUnitParamsRunner.class)経由JUnitParamsと組み合わせるPowerMockを使用しています。 「OK」の時間で完了する〜9000個のユニットテストがありますが、私は8コアCPUを搭載しており、システムはデフォルトのシングルテスト一度だけのランナーで十分に活用されていません。テストを頻繁に実行すると、余分な時間が足り、実際にテストクラスを並行して実行したいのです。

残念ながら、私がPowerMockを使用している理由の一部である静的メソッドを模擬する必要があることは十分な数のテストです。私は
は、静的メソッドを模擬することを試みた何

は、同じJVMですべてを実行し、静的なモックは、すべてのインターリーブと台無しになるので、それは不可能(私の最初のソリューションでした)com.googlecode.junittoolbox.ParallelSuiteのようなものを使用することができますアップ。それとも、少なくとも私が得るエラーに基づいて私には思われる。

私はJUnitスタックをまったく知りませんが、突っ込んだ後に別のオプションを書いて自分自身を挿入しようとするかもしれないようですが、RunnerBuilder - 私は別のものを生成することもできません。 RunnerBuilderからのJVMプロセス、おそらくありません。私は適切な解決策は、ぼかしの仕事として生きる何らかのハーネスであると思う。

また、Androidスタジオ(Intellij's)のテストオプションをいくつか発見しましたが、利用可能なフォークオプションはmethodしかありません。私は現在、この解決策を模索しているので、おそらく私はそれを理解するだろうが、私はまだ多くのロックを持っていないので、コミュニティに並行して尋ねると思った。

UPDATEAll in directory(何らかの理由でパッケージオプションは、再帰的な検索をしませんでした)とフォークモードClassを選ぶ:最後にオプションのテスト種類を使用して、すべての私のテストを収集するために、Androidのメーカー(のIntelliJ)を取得することができました。しかし、これは順次見つかる各テストクラスを実行しており、並列化に関するオプションはありません。これは私が欲しいものに近いですがなく、かなり... :(

答えて

2

TENTATIVE回答

は、この答えは、より良い答えを投稿からあなたを落胆させてはいけません。しかし、私は表示されない場合

Intellijの(Android Studio)組み込みJUnit実行コンフィギュレーションを使用する代わりに、Androidスタジオにはいくつかのプレビルド階調タスクがいくつかあることが気づきました。しかし、それらは同じ逐次実行問題を呈した。私はその後、Run parallel test task using gradleを発見し、私のルートbuild.gradleファイルに次のステートメントを追加しました:

subprojects { 
    tasks.withType(Test) { 
     maxParallelForks = Runtime.runtime.availableProcessors() 
    } 
} 

これは素晴らしい作品優れたテストクラスの数が<なると、私のCPUは、現在、実行のほとんどのために(100%に釘付けになります明らかに使用率は低下します)。

このソリューションの欠点は、Android Studio(Intellij)のpretty junitランナーUIと統合されていないことです。だからgradleタスクが進行している間、私は実際にテストの完了率などを見ることができません。タスクの実行の終了時には、合計実行時間とHTML生成レポートへのリンクが吐き出されます。これはちょっとしたことであり、私はそれを完全に生かすことができますが、JUnitランナーUIを使用するソリューションを改善する方法を理解できればうれしいでしょう。

+1

btw興味のある人は、実行時間は平均4分45秒から平均2分3秒になりました。テストの方法がたくさんある単一のテストクラスのため、長いテールが予想通りには下がらない理由 – Creos

+0

私はこれを答えとして受け入れていますが、より良いアイデアや洗練された答えがあれば(特にありがとうございます。 – Creos

1

質問が投稿されたときにこれはできなかったかもしれませんが、今あなたはアンドロイドスタジオで簡単に行うことができます。 'com.android.tools.build:gradle:2.2.3'

をそして私は私のルートbuild.gradleファイルに次の追加:

私はGradleのビルドツールを使用しています。

allprojects { 
    // ... 
    tasks.withType(Test) { 
     maxParallelForks = Runtime.runtime.availableProcessors() 
    } 
} 

私のテストでは、Gradle Test Executorのランナーがいます。稼働中のマシンのコアが多いほど、あなたはモア・エグゼクティブです!

元の回答をお寄せいただきありがとうございます。

+0

私はmaxParallelForks = 8に設定し、時間の短縮は見られませんでした。他に何をする必要がありましたか? – fobbymaster

+0

投稿していただきありがとうございますが、あなたの答えは私のものとどう違うのですか? :) – Creos

関連する問題