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.
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.
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
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)
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:
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
Respostas:
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.
Desde a versão 1.10 da gradle, ele suporta a seleção de testes, usando um filtro de teste . Por exemplo,
Para ambientes com vários sabores (um caso de uso comum para Android), verifique esta resposta , pois o
--tests
argumento não será suportado e você receberá um erro.fonte
--tests
para 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.Você pode fazer isso
gradle -Dtest.single=ClassUnderTestTest test
se quiser testar uma classe única ou usar o regexp, comogradle -Dtest.single=ClassName*Test test
pode encontrar mais exemplos de classes de filtragem para testes nesta seção 23.12 do link . Teste.fonte
--tests
opção de linha de comando, definida para substituição-DtestTaskName.single
.--test
opçã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 testesomeMethod
dentro da suaMyTest
classe. 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.gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Veja esta discussão em gradle.org--no-rebuild
opção, por exemplo,gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
para impedir a reconstrução de dependências e, por sua vez, executar esse teste único mais rapidamente.Caso você tenha um projeto com vários módulos:
digamos que a estrutura do seu módulo seja
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.
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.
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
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.
fonte
./gradlew :b-module:test --tests testToRun
Depois de muito descobrir, o seguinte funcionou para mim:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
fonte
Observe que a
--tests
opção pode não funcionar se você tiver uma compilação diferentetypes/flavors
(falha comUnknown command-line option '--tests'
). Nesse caso, é necessário especificar a tarefa de teste específica (por exemplo, emtestProdReleaseUnitTest
vez de apenastest
)fonte
./gradlew test --tests *testMyCollectionTake*
e não sei dizer como devo substituirtest
pelo nome do teste curingaAbaixo está o comando para executar uma única classe de teste usando a
gradlew
opção de linha de comando:Abaixo exemplo para executar classe
com.example.TestClass
com varianteVariant_1
:fonte
Você deve tentar adicionar asteriks (*) ao final.
fonte
Execute um único teste chamado MyTest:
fonte
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
fonte