Como executar apenas uma classe de teste local no Gradle

429

Eu sou novo em Gradle. Eu uso o Gradle 1.10 e o Ubuntu 13.

Quero saber se existe algum comando para executar apenas uma classe de teste local , semelhante a 'testonly' no SBT.

bula
fonte
Dadas as respostas, deve ficar claro que se trata de testes locais , não de testes instrumentados . O Android / Gradle torna as coisas confusas chamando esses testes de "unidade" de testes locais.
tir38 27/01

Respostas:

561

Para executar uma única classe de teste, a resposta da Airborn é boa.

Com o uso de algumas opções de linha de comando, encontradas aqui , você pode simplesmente fazer algo assim.

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

Desde a versão 1.10 da gradle, ele suporta a seleção de testes, usando um filtro de teste . Por exemplo,

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"
   }
}

Para ambientes com vários sabores (um caso de uso comum para Android), verifique esta resposta , pois o --testsargumento não será suportado e você receberá um erro.

Maleen Abewardana
fonte
a abordagem filtro provavelmente poderia também ser combinado com regras de tarefas para alguns seleção de teste conveniente
Matt Whipple
Para grandes suítes de teste, mesmo se estiver usando --testspara chamar um único método de teste dentro da classe, vemos iteração em todas as classes, mesmo nas que não estão sendo executadas, o que é muito lento. Não sei se essa lentidão se deve ao nosso ambiente ou se isso afetaria outros. Pode atualizar se encontrar mais.
Arntg
185

Você pode fazer isso gradle -Dtest.single=ClassUnderTestTest testse quiser testar uma classe única ou usar o regexp, como gradle -Dtest.single=ClassName*Test testpode encontrar mais exemplos de classes de filtragem para testes nesta seção 23.12 do link . Teste.

transportado pelo ar
fonte
30
As versões recentes (a partir da versão 1.10) oferecem suporte a uma --testsopção de linha de comando, definida para substituição -DtestTaskName.single.
Peter Niederwieser
58
Com a --testopção, você também pode limitar o teste a um único método dentro da sua classe de teste. Por exemplo: gradle test --tests *MyTest.someMethod executará apenas o único teste someMethoddentro da sua MyTestclasse. Como estou construindo um caso de teste, normalmente executo um único método de cada vez para facilitar o foco apenas na saída necessária para depurar e, em seguida, execute o caso de teste inteiro no final.
Jeff French
10
Também é importante notar que, se você deseja executar um único teste em um projeto de vários módulos, o comando é gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Veja esta discussão em gradle.org
Bulat
2
Você também pode usar uma --no-rebuildopção, por exemplo, gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testpara impedir a reconstrução de dependências e, por sua vez, executar esse teste único mais rapidamente.
falconepl
2
Esta opção está obsoleta no Gradle 5
Eyal
108

Caso você tenha um projeto com vários módulos:

digamos que a estrutura do seu módulo seja

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

e o teste (testToRun) que você deseja executar está no módulo b, com o caminho completo: com.xyz.b.module.TestClass.testToRun

Como aqui você está interessado em executar o teste no módulo b, você deve ver as tarefas disponíveis para o módulo b.

./gradlew :b-module:tasks

O comando acima listará todas as tarefas no módulo b com descrição. E, no caso ideal, você terá uma tarefa chamada test para executar os testes de unidade nesse módulo.

./gradlew :b-module:test

Agora, você atingiu o ponto de execução de todos os testes no módulo b; finalmente, você pode passar um parâmetro para a tarefa acima para executar testes que correspondam ao determinado padrão de caminho

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

Agora, em vez disso, se você executar

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

Ele executará a tarefa de teste para os módulos aeb, o que pode resultar em falha, pois não há nada que corresponda ao padrão acima no módulo a.

greperror
fonte
1
Ou simplesmente./gradlew :b-module:test --tests testToRun
Ahmed Ashour
32

Depois de muito descobrir, o seguinte funcionou para mim:

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

Pratik Khadloya
fonte
10
este comando não está funcionando para mim. > Erro: opção de linha de comando desconhecida '--tests'
Tarkik 26/07
31

Observe que a --testsopção pode não funcionar se você tiver uma compilação diferente types/flavors(falha com Unknown command-line option '--tests'). Nesse caso, é necessário especificar a tarefa de teste específica (por exemplo, em testProdReleaseUnitTestvez de apenas test)

anagaf
fonte
6
Funcionou exatamente nesta situação Obrigado!
JPM
Você pode elaborar um exemplo completo? Estou tentando executar 3 testes que correspondem a um curinga usando ./gradlew test --tests *testMyCollectionTake*e não sei dizer como devo substituir testpelo nome do teste curinga
DanielCuadra
4

Abaixo está o comando para executar uma única classe de teste usando a gradlewopção de linha de comando:

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

Abaixo exemplo para executar classe com.example.TestClasscom variante Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 
Naveenprasanth Duraisamy
fonte
2

Você deve tentar adicionar asteriks (*) ao final.

teste gradle --tests "com.abc *"

mutkan
fonte
2

Execute um único teste chamado MyTest:

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

No meu caso, meus avisos do compilador java do eclipse foram definidos muito altos e o eclipse não estava reconhecendo minha classe como válida para execução. A atualização das configurações do meu compilador corrigiu o problema. Você pode ler mais sobre isso aqui: anotação-não-nula-não pode ser resolvida

Greg
fonte