Как запустить только один локальный тестовый класс на Gradle

430

Я новичок в Gradle. Я использую Gradle 1.10 и Ubuntu 13.

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

Була
источник
Учитывая ответы, должно быть ясно, что речь идет о локальных тестах, а не о инструментальных тестах. Android / Gradle сбивает с толку, называя эти локальные тесты «юнит-тестами».
tir38

Ответы:

562

Для запуска одного теста класса 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если хотите протестировать отдельный класс или использовать регулярное выражение, как, например, gradle -Dtest.single=ClassName*Test testвы можете найти больше примеров фильтрации классов для тестов в этом разделе 23.12 ссылки . Тестовое задание.

Бортовая
источник
30
Последние версии (начиная с 1.10 или около того) поддерживают параметр --testsкомандной строки, который устанавливается для замены -DtestTaskName.single.
Питер Нидервизер
58
С помощью этой --testопции вы также можете ограничить тестирование одним методом в своем классе тестирования. Например: gradle test --tests *MyTest.someMethod запустит только один тест someMethodв вашем MyTestклассе. Когда я создаю тестовый пример, я обычно запускаю один метод за раз, чтобы упростить фокусировку только на выводе, который мне нужен для отладки, а затем запускаю весь тестовый пример в конце.
Джефф Френч
10
Также стоит отметить, что если вы хотите запустить один тест в многомодульном проекте, то команда is 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-модуле с описанием. И в идеальном случае у вас будет задача с именем 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-модуле нет ничего, соответствующего шаблону выше.

greperror
источник
1
Или просто./gradlew :b-module:test --tests testToRun
Ахмед Ашур
32

После долгих размышлений у меня сработало следующее:

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

Пратик Хадлоя
источник
11
эта команда не работает для меня. > Ошибка: неизвестный параметр командной строки '--tests'
Tarkik
32

Обратите внимание, что --testsопция может не работать, если у вас другая сборка types/flavors(не работает с Unknown command-line option '--tests'). В этом случае необходимо указать конкретное тестовое задание (например, testProdReleaseUnitTestвместо просто test)

anagaf
источник
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 - тесты "com.abc *"

mutkan
источник
2

Запустите один тест под названием MyTest:

./gradlew app:testDebug --tests=com.example.MyTest
Крекер
источник
0

В моем случае мои предупреждения компилятора Java Eclipse были установлены слишком высоко, и Eclipse не распознал мой класс как допустимый для выполнения. Обновление настроек моего компилятора устранило проблему. Вы можете прочитать больше об этом здесь: annotation-nonnull-not-be-resolved

Greg
источник