Як запустити лише один місцевий тестовий клас на Gradle


429

Я новачок у Gradle. Я використовую Gradle 1.10 і Ubuntu 13.

Я хочу знати, чи є якась команда для виконання лише одного локального тестового класу, подібного до 'testonly' в SBT.


З огляду на відповіді, має бути зрозуміло, що це стосується локальних тестів, а не інструментальних тестів. 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

З версії 1.10 gradle він підтримує вибір тестів, використовуючи тестовий фільтр . Наприклад,

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аргумент буде непідтримуваний, і ви отримаєте помилку.


підхід до фільтру, ймовірно, також може поєднуватися з правилами завдання для зручного вибору тесту
Метт Віппл

Для великих тестових наборів, навіть якщо використовується --testsдля виклику одного методу тестування в межах класу, ми бачимо ітерацію над усіма класами, навіть усі ті, які не запущені, що занадто повільно. Не знаю, чи пов’язана ця повільність з нашою обставиною чи вона вплине на інших. Можна оновити, якщо знайти більше.
arntg

185

Ви можете зробити, gradle -Dtest.single=ClassUnderTestTest testякщо ви хочете протестувати один клас або використовувати regexp, як gradle -Dtest.single=ClassName*Test testви можете знайти додаткові приклади фільтрування класів для тестів у цьому розділі посилань 23.12. Тест.


30
Останні версії (починаючи з 1.10 або більше) підтримують --testsпараметр командного рядка, який встановлено на заміну -DtestTaskName.single.
Пітер Нідервайзер

58
За допомогою цієї --testопції ви також можете обмежити тестування лише одним методом у вашому тестовому класі. Наприклад: gradle test --tests *MyTest.someMethod запустить лише один тест someMethodу вашому MyTestкласі. Оскільки я будую тестовий випадок, я зазвичай запускаю поодинці метод одночасно, щоб було простіше зосередитись лише на висновку, який мені потрібен для налагодження, а потім запустити весь тестовий випадок наприкінці.
Джефф Френч

10
Також варто зазначити, що якщо ви хочете запустити єдиний тест у мультимодульному проекті, тоді команда є gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Дивіться цю дискусію на gradle.org
Булат

2
Ви також можете скористатись --no-rebuildопцією, наприклад, gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testщоб запобігти перебудові залежностей і, в свою чергу, швидше виконати цей єдиний тест.
falconepl

2
Цей варіант заборонений у Gradle 5, хоча
Eyal

108

У випадку, якщо у вас є багатомодульний проект:

скажімо, ваша структура модуля така

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

і тест (testToRun), який ви хочете виконати, знаходиться в b-модулі, з повним контуром: com.xyz.b.module.TestClass.testToRun

Оскільки тут вам цікаво запустити тест у b-модулі, тому ви повинні побачити завдання, доступні для b-модуля.

./gradlew :b-module:tasks

Вищевказана команда перелічить усі завдання в b-модулі з описом. І в ідеальному випадку у вас буде завдання з ім'ям тесту для запуску одиничних тестів у цьому модулі.

./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
підказки,

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

Спробуйте додати до кінця зірочки (*).

test gradle --тести "com.abc *"


2

Запустіть єдиний тест під назвою MyTest:

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

0

У моєму випадку попередження компілятора Java eclipse були встановлені занадто високо, і eclipse не визнавав мій клас дійсним для виконання. Оновлення моїх налаштувань компілятора вирішило проблему. Більше про це можна прочитати тут: annotation-nonnull-неможливо вирішити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.