Confuso sobre testCompile e androidTestCompile no Android Gradle

87

Sou novo no mundo dos testes e ainda mais no mundo dos testes do Android. Ao fazer uma pesquisa sobre Robolectric que ajuda em testes no Android, uma coisa me confunde mais. Às vezes, na web, vejo pessoas usando testCompilepalavras-chave nas dependências do script de compilação do Gradle ao fazer referência ao Robolectric enquanto outros usam androidTestCompile. Certamente ambos não podem ser válidos?

Alguém pode explicar a diferença entre os dois e qual deles deve ser usado ao usar o Robolectric?

Lucas
fonte

Respostas:

120

Simplesmente testCompileé a configuração para testes de unidade (aqueles localizados em src / test ) e androidTestCompileé usada para a API de teste (aquela localizada em src / androidTest ). Uma vez que você pretende escrever testes de unidade, você deve usar testCompile.

Atualização: A principal diferença entre os dois é que o conjunto de testfontes é executado em uma JVM Java regular, enquanto os androidTesttestes do conjunto de fontes são executados em um dispositivo Android (ou emulador).

Mark Vieira
fonte
Obrigado. Isso é o que eu percebi no início, mas se for esse o caso, por que alguns fazem referência à dependência robolétrica com testCompile e outros com androidTestCompile. Não é uma biblioteca que ajuda a escrever testes de integração? Se sim, então não deveria ser referenciado com androidTestCompile? No entanto, até mesmo o guia oficial do robolectric direciona o uso do testCompile ... Desculpe, mas é muito confuso para mim neste ponto, como você pode ver.
Lucas
3
As convenções de nomenclatura são um pouco estranhas. Basicamente, se você estiver escrevendo testes de unidade (testes que não serão executados no dispositivo), eles existiriam em 'src / test' e, portanto, suas dependências pertenceriam à testCompileconfiguração. As dependências adicionadas à androidTestCompileconfiguração estarão disponíveis apenas para a fonte em 'src / androidTest', que na verdade é integrado a um APK e implantado em um dispositivo.
Mark Vieira
Obrigado por me apontar alguma direção. Não respondeu a todas as minhas perguntas, mas me ajudou durante minha pesquisa. Apenas para esclarecer o que você disse, os testes de unidade não são apenas aqueles na pasta de teste (por padrão). Ironicamente, o Google às vezes chama os testes localizados no androidTest também como testes de unidade. Depende, claro, do propósito de um teste específico, mas ainda aumenta a confusão.
Lucas
1
Isso é principalmente semântico, então eu não ficaria preso a eles. Muitos testes escritos com Roboelectric são testes de integração, e não testes de unidade de qualquer maneira. Dito isso, a principal distinção entre os dois é que 'src / test' é executado na máquina do desenvolvedor em uma JVM padrão e 'src / androidTest' é empacotado em um APK e executado em um dispositivo real (ou emulador).
Mark Vieira
1
Acho que o suporte para 'src / test' que você viu antes era simplesmente aquele que estava disponível por meio do plugin Java Gradle padrão. Portanto, não havia suporte para sabores ou tipos de compilação. Agora, o plug-in do Android tem suporte total para testes de unidade, para incluir conjuntos de fontes de teste de unidade por variante.
Mark Vieira
3

Para responder à sua pergunta - Use testCompile for robolectric

porque, porque o robolectric é executado na JVM, simulando todo o comportamento do dispositivo Android.

testCompile e androidTestCompile são pastas do Android "por convenção" que o Gradle usa ao executar tarefas fornecidas pelo plug-in android.

androidTestDebug seleciona testes da pasta androidTest, testDebug seleciona testes da pasta de teste,

Novamente, estas são apenas pastas de convenção; você pode fornecer conjuntos de fontes para essas configurações

Nota: espresso é uma biblioteca incrível, tente se afastar do robolectric :)

Amit Kaushik
fonte
1

// teste de unidade

testCompile 'junit:junit:4.12'

O código acima é uma dependência do JUnit 4 no arquivo build.gradle no android studio. Você vê que ele tem testCompile, porque JUnit roda em JVM e não requer um dispositivo ou emulador para rodar. Isso também significa que os testes JUnit não exigirão que o contexto do aplicativo seja executado e, se eles exigirem, precisaremos "MOCK" eles.

// Teste de Unidade Insturmented

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Agora vemos androidTestCompile aqui, pois desta vez pretendemos usar o dispositivo ou emulador para testes, ou seja, testes de Instrumentação. Para um melhor esclarecimento, sugiro ler em developer.android.com

Lazycoder_007
fonte
0

Para adicionar Dependência para teste JVM ou teste de Unidade (os testes dependem apenas do ambiente java, não precisamos de nenhum ambiente Android).

Usamos a diretiva testCompile. Exemplo:

dependencies {
    testCompile gradleTestKit()
}

Para adicionar o teste de Dependência para Instrumentação (esses testes dependem principalmente do ambiente Android), usamos a androidTestCompilediretiva.

Subhasish Nath
fonte