Gradleでローカルテストクラスを1つだけ実行する方法


429

Gradleは初めてです。私はGradle 1.10とUbuntu 13を使用しています。

SBTの「testonly」のように、1つのローカルテストクラスのみを実行するコマンドがあるかどうかを知りたいです。


答えを考えると、これは機器テストではなくローカルテストに関するものであることは明らかです。Android / Gradleは、これらのローカルテストを「ユニット」テストと呼ぶことにより、混乱を招きます。
tir38

回答:


560

単一のテストクラスを実行するには、Airbornの答えが適切です。

ここにあるいくつかのコマンドラインオプションを使用すると、このようなことを簡単に実行できます。

gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui

Gradleバージョン1.10以降では、テストフィルターを使用したテストの選択をサポートしています。例えば、

apply plugin: 'java'

test {
  filter {
    //specific test method
      includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"

     //specific test method, use wildcard for packages
     includeTestsMatching "*SomeTest.someSpecificFeature"

     //specific test class
     includeTestsMatching "org.gradle.SomeTest"

     //specific test class, wildcard for packages
     includeTestsMatching "*.SomeTest"

     //all classes in package, recursively
     includeTestsMatching "com.gradle.tooling.*"

     //all integration tests, by naming convention
      includeTestsMatching "*IntegTest"

     //only ui tests from integration tests, by some naming convention
     includeTestsMatching "*IntegTest*ui"
   }
}

マルチフレーバー環境(Android用の一般的なユースケース)の場合、この答えをチェックして、--tests引数はサポートされていないでしょうし、あなたがエラーを取得します。


フィルターアプローチは、いくつかの便利なテスト選択のためにタスクルールと組み合わせることもできます
Matt Whipple 2017年

大規模なテストスイートの場合、を使用--testsしてクラス内の単一のテストメソッドを呼び出す場合でも、実行されていないクラスも含めて、すべてのクラスの反復が見られます。これは遅すぎます。その遅さの原因が私たちの環境にあるのか、それとも他の人に影響するのかわかりません。もっと見つけたら更新できます。
arntg

185

あなたは行うことができますgradle -Dtest.single=ClassUnderTestTest testあなたのような単一のクラスまたは使用の正規表現をテストしたい場合はgradle -Dtest.single=ClassName*Test test、あなたがテストのためのフィルタリングクラスの他の例を見つけることができます。このリンクの下のセクション23.12を。テスト。


30
最近のバージョン(1.10から始まる)--testsは、置換するように設定されているコマンドラインオプションをサポートしてい-DtestTaskName.singleます。
Peter Niederwieser 2014年

58
では--testオプションまた、あなたのテストクラス内の単一のメソッドをテスト制限することができます。たとえば 、クラス内でgradle test --tests *MyTest.someMethod 1つのテストのみを実行someMethodしますMyTest。テストケースを作成するときは、通常、一度に1つのメソッドを実行して、デバッグする必要のある出力のみに集中しやすくし、最後にテストケース全体を実行します。
ジェフフランス語

10
また、マルチモジュールプロジェクトで単一のテストを実行する場合、コマンドはgradle -D:submodule:test.single=ClassUnderTestTest :submodule:testです。gradle.orgのこのディスカッションを
Bulat

2
--no-rebuildオプションを使用することもできます。たとえばgradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test、依存関係が再構築されないようにして、その単一のテストをより速く実行したい場合があります。
falconepl 2016

2
ただし、このオプションはGradle 5では非推奨
Eyal

108

マルチモジュールプロジェクトがある場合:

あなたのモジュール構造が

root-module
 -> a-module
 -> b-module

実行しようとしているtest(testToRun)は、フルパスのb-moduleにあります:com.xyz.b.module.TestClass.testToRun

ここでは、bモジュールでテストを実行することに関心があるので、bモジュールで使用可能なタスクが表示されます。

./gradlew :b-module:tasks

上記のコマンドは、bモジュールのすべてのタスクを説明付きで一覧表示します。そして理想的なケースでは、そのモジュールで単体テストを実行するためのtestというタスクがあります。

./gradlew :b-module:test

これで、bモジュールですべてのテストを実行するポイントに到達しました。最後に、上記のタスクにパラメーターを渡して、特定のパスパターンに一致するテストを実行できます。

./gradlew :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"

さて、あなたが実行した場合、これの代わりに

./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"

モジュールaとbの両方に対してテストタスクを実行します。aモジュールには上記のパターンに一致するものが何もないため、失敗する可能性があります。


1
または単に./gradlew :b-module:test --tests testToRun
アーメドアシュアール

32

多くのことを考え出した後、次のことがうまくいきました:

gradle test --tests "a.b.c.MyTestFile.mySingleTest"


10
このコマンドは機能しません。>エラー:不明なコマンドラインオプション '--tests'
Tarkik

31

--testsビルドが異なる場合、オプションが機能しない場合があることに注意してくださいtypes/flavors(で失敗しますUnknown command-line option '--tests')。この場合、特定のテストタスクを指定する必要があります(例:testProdReleaseUnitTestだけでなくtest


6
この正確な状況に遭遇ありがとう
JPM

完全な例を詳しく説明できますか?ワイルドカードを使用して3つのテストを実行しようとしていますが、ワイルドカードテスト名./gradlew test --tests *testMyCollectionTake*に置き換える方法がわかりませんtest
DanielCuadra

4

以下は、コマンドgradlewラインオプションを使用して単一のテストクラスを実行するコマンドです。

gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

com.example.TestClassバリアントでクラスを実行する以下の例Variant_1

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 

2

最後にアスタリスク(*)を追加する必要があります。

gradle test --tests "com.abc *"


2

MyTestという単一のテストを実行します。

./gradlew app:testDebug --tests=com.example.MyTest

0

私の場合、Eclipse Javaコンパイラの警告の設定が高すぎるため、Eclipseがクラスを実行に有効であると認識していませんでした。コンパイラ設定を更新すると問題が解決しました。詳細については、こちらをご覧ください:annotation-nonnull-cannot-be-resolved

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.