Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Teste - SDK Java

Nesta página

  • Testes de integração
  • Contexto do aplicativo
  • Linha Looper
  • Atraso na execução do teste enquanto as chamadas assíncronas são concluídas
  • Testando o backend
  • Testando o Atlas Cluster
  • Exemplo completo
  • Testes unitários
  • Exemplo completo

Você pode testar seu aplicativo usando testes de unidade ou testes de integração. Os testes de unidade avaliam apenas a lógica escrita no código do aplicativo. Os testes de integração avaliam a lógica do aplicativo, as queries e gravações do banco de dados e as chamadas para o backend do aplicativo, se você tiver um. Os testes de unidade são executados em sua máquina de desenvolvimento usando a JVM, enquanto os testes de integração são executados em um dispositivo Android físico ou emulado. Você pode executar testes de integração comunicando-se com instâncias reais do Realm ou um backend de aplicativo usando os testes instrumentados internos do Android.

O Android usa caminhos de arquivo e nomes de pastas específicos em projetos Android para testes de unidade e testes instrumentados:

Tipo de teste
Caminho
Testes unitários
/app/src/test
Testes instrumentados
/app/src/androidTest

Como o SDK usa código C++ via Android Native para armazenamento de dados, o teste de unidade exige que você simule totalmente as interações com o Realm. Prefira testes de integração para lógica que exija ampla interação com o banco de dados.

Esta seção mostra como testar a integração de um aplicativo que usa o Realm SDK. Ele abrange os seguintes conceitos no ambiente de teste:

  • adquirindo um contexto de aplicativo

  • executando lógica em um tópico Looper

  • como atrasar a execução do teste enquanto chamadas de método assíncrono são concluídas

Os aplicativos que usam o Sync ou um aplicativo de backend também exigem (não abordado aqui):

  • um backend de aplicativo separado para testes, com contas de usuário e dados separados

  • um Atlas cluster separado contendo dados somente de teste

Para inicializar o SDK, você precisará fornecer um contexto deaplicativo ou atividade . Por padrão, isso não está disponível em testes de integração do Android. No entanto, você pode usar o ActivityScenario de teste integrado do Android turma para iniciar uma atividade em seus testes. Você pode usar qualquer atividade do seu aplicativo ou criar uma atividade vazia apenas para teste.ActivityScenario.launch() Ligue para com sua classe de atividade como um parâmetro para iniciar a atividade simulada.

Em seguida, use o método ActivityScenario.onActivity() para executar uma lambda na thread principal da atividade simulada. Nesta lambda, você deve chamar a função Realm.init() para inicializar o SDK com sua atividade como um parâmetro. Além disso, você deve salvar o parâmetro passado para sua lambda (a instância recém-criada de sua atividade) para uso futuro.

Como o método onActivity() é executado em um thread diferente, você deve impedir que o teste seja executado até que essa configuração inicial seja concluída.

O exemplo a seguir utiliza um ActivityScenario, uma atividade de teste vazia e um CountDownLatch para demonstrar como configurar um ambiente onde você pode testar seu aplicativo Realm:

A funcionalidade de realm, como objetos Live e notificações de alteração, só funciona no Looper threads. Os threads configurados com um Looper objeto transmitem eventos em um loop de mensagens coordenado pelo Looper. Normalmente, as funções de teste não têm um Looper objeto , e a configuração de um objeto para funcionar em seus testes pode ser muito propensa a erros.

Em vez disso, você pode usar o arquivo Activity.runOnUiThread() método da sua atividade de teste para executar lógica em um thread que já tem um Looper configurado. Combine Activity.runOnUiThread() com um CountDownLatch conforme descrito na seção de atraso para impedir que o teste seja concluído e encerrado antes que a lógica seja executada. Na runOnUiThread() chamada , você pode interagir com o SDK da mesma forma que faria normalmente no código do seu aplicativo:

Como o SDK usa chamadas assíncronas para operações comuns, como queries de banco de dados, autenticação e chamadas de função, os testes precisam de uma maneira de aguardar a conclusão dessas chamadas assíncronas. Caso contrário, seus testes serão encerrados antes que suas chamadas assíncronas (ou multisegmentadas) sejam executadas. Este exemplo usa o CountDownLatchincorporado do Java . Siga estas etapas para utilizar um CountDownLatch em seus próprios testes:

  1. Instancie um CountDownLatch com uma contagem de 1.

  2. Depois de executar a lógica assíncrona que seu teste precisa esperar, chame o método countDown() dessa instância CountDownLatch.

  3. Quando você precisar esperar pela lógica assíncrona, adicione um bloco try/catch que lida com um InterruptedException. Nesse bloco, chame o método await() dessa instância CountDownLatch .

  4. Passe um intervalo de tempo limite e unidade para await() e encerre a chamada em uma asserção Assert.assertTrue(). Se a lógica demorar muito, a chamada await() expira, retornando falso e falhando no teste.

O exemplo a seguir demonstra o uso de um CountDownLatch para aguardar a autenticação e abrir um realm de forma assíncrona em um thread separado:

Os aplicativos que usam um backend de aplicativo não devem se conectar ao backend de produção para fins de teste pelos seguintes motivos:

  • você deve sempre manter usuários de teste e usuários de produção separados por motivos de segurança e privacidade

  • os testes geralmente exigem um estado inicial limpo, portanto, há uma boa chance de que seus testes incluam um método de configuração ou desmontagem que exclua todos os usuários ou grandes blocos de dados

Você pode usar ambientes para gerenciar apps separados para teste e produção.

Os aplicativos que usam queries Sync ou MongoDB podem ler, gravar, atualizar ou excluir dados armazenados em clusters Atlas conectados. Por motivos de segurança, não deve armazenar dados de produção e dados de teste no mesmo cluster. Além disso, os testes podem exigir mudanças no esquema antes que essas alterações sejam tratadas normalmente em seu aplicativo de produção. Como resultado, você deve utilizar um Atlas cluster separado ao testar seu aplicativo.

O exemplo a seguir mostra um exemplo completo da Junit instrumentado androidTest executando o Realm em testes de integração:

Dica

Veja também:

Veja o aplicativode Exemplos de Documentação do Realm para obter um exemplo de teste de integração do SDK localmente e com um backend ativo.

Para unir aplicativos Realm de teste que usam Realm, você deve mock Realm (e seu backend de aplicativo, se usar um). Use as seguintes bibliotecas para simular a funcionalidade do SDK:

Para disponibilizar estas bibliotecas para teste unitário em seu projeto Android, adicione o seguinte ao bloco dependencies do seu arquivo build.gradle do aplicativo:

testImplementation "org.robolectric:robolectric:4.1"
testImplementation "org.mockito:mockito-core:3.3.3"
testImplementation "org.powermock:powermock-module-junit4:2.0.9"
testImplementation "org.powermock:powermock-module-junit4-rule:2.0.9"
testImplementation "org.powermock:powermock-api-mockito2:2.0.9"
testImplementation "org.powermock:powermock-classloading-xstream:2.0.9"

Observação

Compatibilidade de versão

O acoplamento do SDK em testes unitários requer Robolectric, Mockito e Powermock porque o SDK usa chamadas de método Android Native C++ para interagir com o Realm. Como as estruturas necessárias para substituir essas chamadas de método podem ser delicadas, você deve usar as versões listadas acima para garantir que sua simulação seja bem-sucedida. Algumas atualizações de versão recentes (especialmente a versão 4.2+ do Robolectric) podem interromper a compilação de testes de unidade usando o SDK.

Para configurar seus testes de unidade para usar Robolectric, PowerMock e Mockito com o SDK, adicione as seguintes anotações a cada classe de teste de unidade que modela o SDK:

Em seguida, a bootstrap Powermock globalmente na classe de teste:

Em seguida, simule os componentes do SDK que podem executar queries do código C++ nativo para que não atinjamos as limitações do ambiente de teste:

Depois de concluir a configuração necessária para a simulação, você pode começar a simular componentes e conectar o comportamento dos seus testes. Você também pode configurar o PowerMockito para retornar objetos específicos quando novos objetos de um tipo forem instanciados, de modo que mesmo o código que faz referência ao realm padrão em seu aplicativo não interromperá seus testes:

Depois de simular um domínio, você precisará configurar os dados para seus casos de teste. Consulte o exemplo completo abaixo para ver alguns exemplos de como fornecer dados de teste em testes unitários.

O exemplo a seguir mostra um exemplo JUnit test completo simulando o Realm em testes de unidade. Este exemplo testa uma atividade que realiza algumas operações básicas do Realm. Os testes usam o acoplamento para simular essas operações quando essa atividade é iniciada durante um teste de unidade:

Dica

Veja também:

Consulte o exemplo de teste de unidade do aplicativo para obter um exemplo de teste de unidade de um aplicativo que usa o Realm.

← Depuração - SDK Java