Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Testes UI com simulação de falta de conexão ou lentidão

Bom dia a todos

Eu sei que a minha dúvida foge um pouco do assunto do curso, mas me surgiu uma dúvida em relação à isso.

Vimos na aula a questão do try/catch para evitar exceções no app por falta de conexão ou conexão lenta. Exemplo de código:

            try {
                val response = service.findAll()
                val entities = response.map { it.toMovieEntity() }
                dao.saveAll(*entities.toTypedArray())
                //catch de exceção por falta de conexão
            } catch (e: ConnectException) {
                Log.e("MovieRepository","findSections: falha ao conectar na API")
                //catch de exceção por timeout da tarefa da conexão
            } catch (e: SocketTimeoutException){
                Log.e("MovieRepository","findSections: Demora na conexão da API")
            }

E logo veio na minha cabeça fazer UI testes para confirmar(usando bibliotecas como o navigation-testing e outros), como vimos no curso de Jetpack Compose: criando Deep links e testando o Navigation.

A minha dúvida é: como fazemos para simular falta de internet ou lentidão na conexão em ambientes de testes? Isso sem fazer de maneira manual, como desligar a internet, wifi do computador ou do emulador, fazendo isso dentro do código

1 resposta
solução!

Opa Murilo, beleza?

É uma ótima pergunta, e simular diferentes condições de rede durante os testes é uma prática importante para garantir que seu aplicativo se comporte corretamente em várias situações.

Nos testes de UI, como você mencionou, simular falta de internet ou lentidão na conexão é fundamental para testar como o aplicativo lida com essas situações adversas. Felizmente, existem algumas abordagens que você pode usar para simular essas condições sem precisar desligar manualmente a internet ou a rede do dispositivo ou emulador. Aqui estão algumas opções:

  1. MockWebServer: O MockWebServer é uma biblioteca que permite simular um servidor HTTP para testes. Ele permite que você defina cenários de resposta, como respostas lentas ou falhas de conexão. Isso é útil para simular diferentes condições de rede durante os testes de UI. Link para exemplo

  2. Test Double de Rede: Você pode criar uma implementação falsa da classe de serviço de rede que você está usando (por exemplo, Retrofit) e substituir a implementação real durante os testes. A implementação falsa pode retornar respostas específicas para diferentes cenários, incluindo simular falhas de conexão ou respostas lentas. Link para exemplo

  3. Emulador Android: O emulador Android tem uma ferramenta de emulação de rede que permite simular diferentes condições de rede, incluindo desconexões e latências. Você pode usar o emulador para testar como o aplicativo se comporta em diferentes cenários de rede (uma alternativa seria você fazer manual ou automaticamente algum teste de deixar no modo avião ou desligar os dados, não há problema algum em fazê-los :) ).

  4. Teste de Integração: Além dos testes de UI, você também pode escrever testes de integração que simulam diferentes condições de rede. Isso permite que você teste a interação entre diferentes partes do aplicativo sob condições controladas. Link para exemplo

  5. Variáveis de Ambiente ou Flags: Uma abordagem mais avançada é usar variáveis de ambiente ou flags em seu código para controlar o comportamento do aplicativo. Durante os testes, você pode definir essas variáveis de modo que o aplicativo aja como se estivesse em uma condição de rede específica.

A abordagem que você escolhe dependerá do contexto e da complexidade do seu aplicativo. Independentemente do método escolhido, a ideia é criar um ambiente de teste controlado que permita simular diferentes condições de rede para garantir que seu aplicativo lide adequadamente com essas situações adversas.

Qualquer coisa, estarei à disposição :)