Página inicial do Docs → Desenvolver aplicações → Atlas Device SDKs
Teste - SDK Java
Nesta página
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.
Testes de integração
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
Contexto do aplicativo
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:
Linha Looper
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:
Atraso na execução do teste enquanto as chamadas assíncronas são concluídas
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:
Instancie um
CountDownLatch
com uma contagem de 1.Depois de executar a lógica assíncrona que seu teste precisa esperar, chame o método
countDown()
dessa instânciaCountDownLatch
.Quando você precisar esperar pela lógica assíncrona, adicione um bloco
try
/catch
que lida com umInterruptedException
. Nesse bloco, chame o métodoawait()
dessa instânciaCountDownLatch
.Passe um intervalo de tempo limite e unidade para
await()
e encerre a chamada em uma asserçãoAssert.assertTrue()
. Se a lógica demorar muito, a chamadaawait()
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:
Testando o backend
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.
Testando o Atlas Cluster
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.
Exemplo completo
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.
Testes unitários
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.
Exemplo completo
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.