Como testar um projeto de biblioteca Android

97

Estou escrevendo um projeto de biblioteca Android baseado na classe Android Bitmap (chame-o de AndroindLib), que contém apenas a classe de utilitário (sem atividade). Tentei testá-lo usando o Android JUnit, mas ele continua reclamando que não consegue encontrar o AnroidLib.apk

Qual é a maneira certa de testar a unidade do Android Library Project?

Lírio
fonte
1
Ou ( alerta de plug sem vergonha ) você pode usar um projeto que criei: Android Library Test Harness (que gosto de chamar de "Alt H"). Ele está disponível como um repositório git: gitorious.org/alth O projeto ainda está em desenvolvimento e a documentação é um pouco esparsa, então sinta-se à vontade para entrar em contato comigo se tiver alguma dúvida.
i41

Respostas:

75

Citando a documentação :

"Existem duas maneiras recomendadas de configurar o teste de código e recursos em um projeto de biblioteca:

  • Você pode configurar um projeto de teste que instrumenta um projeto de aplicativo que depende do projeto de biblioteca. Você pode então adicionar testes ao projeto para recursos específicos da biblioteca.

  • Você pode configurar um projeto de aplicativo padrão que dependa da biblioteca e colocar a instrumentação nesse projeto. Isso permite criar um projeto independente que contém os testes / instrumentações e o código a ser testado. "

CommonsWare
fonte
27
então, basicamente, tudo que você precisa fazer é adicionar a biblioteca ao seu projeto de teste e testar o projeto de teste.
njzk2
O link não é mais válido, alguma chance de você nos indicar o atual?
Abdullah Jibaly
4
Não tenho certeza se alguém teve sucesso com essas recomendações, mas eu não. Tentei a segunda solução primeiro e quando tento executar no Eclipse obtenho o seguinte: <ProjectName> não especifica uma instrumentação android.test.InstrumentationTestRunner ou não declara usa-library android.test.runner em seu AndroidManifest.xml. Isso apesar do fato de eu ter adicionado os elementos de instrumentação e biblioteca de usos ao meu Manifesto.
Bellinghammer
2
Peguei o segundo (e método preferido de trabalho). É muito importante que você obtenha os elementos de biblioteca de usos e instrumentação no local correto em seu manifesto. O elemento instrumentation é filho do elemento root manifest e o elemento uses-library é filho do elemento application. Eu estava colocando a biblioteca de usos sob o elemento de manifesto e terminando com a mensagem de erro acima ao tentar executar os testes.
Bellinghammer
17

Em seu projeto de teste, simplesmente altere o nome do pacote para que seja igual ao pacote de sua biblioteca. Por exemplo, você tem uma biblioteca cujo pacote é "com.example.lib". Crie um projeto de teste visando sua biblioteca. No arquivo de manifesto, você verá package="com.example.lib.test"e targetPackage="com.example.lib". Basta alterar o pacote de "com.example.lib.test" para "com.example.lib" ( targetPackagedeixe como está).

Além disso, certifique-se de que a biblioteca seja referenciada ao seu projeto de teste NÃO no caminho de construção Java, mas como uma biblioteca Android normal: no Eclipse, ela deve ser mostrada como biblioteca na Project->Properties->Androidguia, mas não na Project->Properties->Java Build Pathguia.

Em seguida, execute seus testes.

alexaschka
fonte
Suas ideias fizeram sentido para mim, de modo que o teste foi direcionado a si mesmo (como o aplicativo) e o aplicativo foi vinculado à biblioteca ... mas não consegui fazê-lo funcionar por meio do ant build nem do IntelliJ ... como o .apk (esperado para o aplicativo em teste) não existia quando ele tentou instalá-lo, pois está sendo compilado em "test / bin /.- debug.apk"
Andrew Mackenzie
Comecei a trabalhar mudando apenas o nome do pacote do projeto de teste em seu manifesto (e o pacote em teste - que deve ser o mesmo) para NÃO coincidir com o nome do pacote do projeto de biblioteca, além de remover a referência ao teste de destino projeto no arquivo ant.properties.
Andrew Mackenzie
1
Acho que esta é uma resposta melhor do que a aceita, que apenas ecoa a documentação - IMHO.
Andrew Mackenzie
5

Pela documentação :

Testar um módulo de biblioteca é o mesmo que testar um aplicativo. A principal diferença é que a biblioteca e suas dependências são incluídas automaticamente como dependências do APK de teste. Isso significa que o APK de teste inclui não apenas seu próprio código, mas também o AAR da biblioteca e todas as suas dependências. Como não há um "aplicativo em teste" separado, a tarefa androidTest instala (e desinstala) apenas o APK de teste. Ao mesclar vários arquivos de manifesto, o Gradle segue a ordem de prioridade padrão e mescla o manifesto da biblioteca no manifesto principal do APK de teste.

Avilio
fonte
qual tarefa executar testes? gradle test ou gradle androidTest? androidTest não é uma tarefa.
Sunnyday
mas ferramentas como o Firebase Test Lab exigem um APK ou AAB e não aceitam um arquivo AAR que é a saída da tarefa de montagem da biblioteca
Mustafa Berkay Mutlu
1

NOTA: Esta solução é baseada no uso do Eclipse Indigo (3.8.2) e pode ter que ser implementada de maneira ligeiramente diferente para outro IDE, embora os princípios básicos sejam os mesmos.

Tive problemas semelhantes e descobri que fazer o seguinte sempre funciona:

( NOTA: Estas instruções são para construir um novo grupo de projetos do zero. Se você já construiu partes do grupo de projetos, pode ter que modificar seus projetos para que se conectem da mesma maneira. )

  1. Crie um novo projeto de biblioteca Android marcando a caixa de seleção "Is Library" durante a criação. (por exemplo, um projeto Android denominado "RemingtonAndroidTools").
  2. Construa o projeto Android Library e verifique se ele criou um arquivo jar na pasta bin. (por exemplo, um arquivo jar denominado "RemingtonAndroidTools.jar".)
  3. Crie um projeto Android vazio para testar o aplicativo Android que servirá como um aplicativo de teste Android. (Por exemplo, um projeto Android denominado "RemingtonAndroidToolsTestApp"). Você não precisará modificar o código-fonte ou os recursos do projeto Android Test App, a menos que tenha algo que deva ser adicionado para teste. Muitas coisas podem ser testadas sem nenhuma modificação no Android Test App Project. O projeto Android Test App é uma ponte entre seu projeto Android Library e o projeto Android Junit que torna possível o teste do projeto Android Library por meio do Android Junit.
  4. Vá para a guia Biblioteca do Java Build Path para o projeto Android Test App ("RemingtonAndroidToolsTestApp" neste exemplo).
  5. Adicione o arquivo jar ("RemingtonAndroidTools.jar" neste exemplo) do Android Library Project ("RemingtonAndroidTools" neste exemplo) por meio do botão "Adicionar Jars ...".
  6. Crie um novo projeto Android Test (por exemplo "RemingtonAndroidToolsTester") que servirá como um Android Library Tester e selecione o projeto Android Test App ("RemingtonAndroidToolsTestApp" neste exemplo) como o destino.
  7. Vá para a guia Biblioteca do Java Build Path para o projeto Android Library Tester ("RemingtonAndroidToolsTester" neste exemplo).
  8. Adicione o arquivo jar ("RemingtonAndroidTools.jar" neste exemplo) do Android Library Project ("RemingtonAndroidTools" neste exemplo) por meio do botão "Adicionar Jars ...".
  9. Encontre a última pasta do seu pacote Android no projeto Android Library Tester ("danny.remington.remington_android_tools_test_app.test" por exemplo) e adicione uma classe de teste ("MainActivityTest" por exemplo) que herda de ActivityInstrumentationTestCase2.
  10. Edite a classe de teste ("TestActivityTest" neste exemplo) para usar a atividade (por exemplo "TestActivity") do Android Test App ("RemingtonAndroidToolsTestApp" neste exemplo) como o parâmetro para ActivityInstrumentationTestCase2.
  11. Edite a classe de teste ("TestActivityTest" neste exemplo) e crie um construtor padrão que faça uma chamada para super (Class) e passando na classe do Android Test App ("TestActivity.class" por exemplo).

Você deve terminar com três projetos (Android Library, Android Test App, Android Library Tester) semelhantes a este:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Você deve terminar com uma aula para testar sua biblioteca Android semelhante a esta:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Você pode então adicionar qualquer teste que desejar. Você não precisará fazer referência ao Android Test App ("RemingtonAndroidToolsTestApp" neste exemplo) para executar seus testes, a menos que eles requeiram acesso a um componente específico do Android (como a pasta Assets, por exemplo). Se você precisar acessar qualquer componente específico do Android, pode fazê-lo modificando o Android Test App ("RemingtonAndroidToolsTestApp" neste exemplo) e referenciando-o por meio da instrumentação fornecida pela API Android Junit padrão. (Você pode ler mais sobre isso aqui: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
fonte
0

Se suas classes de ulitiy não dependem de nenhum código específico do Android, você pode apenas usar os testes de unidade JUnit padrão. Não há necessidade de usar as versões do Android.

Cheryl Simon
fonte
2
Isso não funciona porque o JUnit padrão é compilado para o JVM padrão, enquanto os arquivos Java do Android são compilados para o VM Dalvik.
Danny Remington - OMS