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.
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.
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.
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 --tests
argumento não será suportado e você receberá um erro.
--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, como gradle -Dtest.single=ClassName*Test test
pode encontrar mais exemplos de classes de filtragem para testes nesta seção 23.12 do link . Teste.
--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 teste someMethod
dentro da sua MyTest
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
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.
./gradlew :b-module:test --tests testToRun
Depois de muito descobrir, o seguinte funcionou para mim:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
Observe que a --tests
opçã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 testProdReleaseUnitTest
vez de apenas test
)
./gradlew test --tests *testMyCollectionTake*
e não sei dizer como devo substituir test
pelo nome do teste curinga
Abaixo está o comando para executar uma única classe de teste usando a gradlew
opção de linha de comando:
gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass
Abaixo exemplo para executar classe com.example.TestClass
com variante Variant_1
:
gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass
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