Aula 14 - Testes, Qualidade e Debugging 🐞
Objetivo
Objetivo: Aprender a encontrar e corrigir erros de forma profissional, utilizar o Logcat e escrever testes automatizados (Unitários e de UI) para garantir a estabilidade do app.
1. O Logcat: Seu melhor amigo 📝
Esqueça o println. No Android, usamos a classe Log para monitorar o que acontece.
Log.v("TAG", "Verbose - Detalhes irrelevantes")
Log.d("TAG", "Debug - Informação para o dev")
Log.i("TAG", "Info - Evento importante (Login, etc)")
Log.w("TAG", "Warning - Algo estranho, mas não quebrou")
Log.e("TAG", "Error - QUEBROU! 💥")
No Android Studio, você pode filtrar logs pela TAG ou pelo nível de erro.
2. Debugging Passo a Passo 🛠️
Quando o app trava ou tem um comportamento estranho: 1. Coloque um Breakpoint (clique na lateral da linha). 2. Rode o app em modo Debug (Ícone do besouro). 3. O app vai "congelar" naquela linha e você poderá ver o valor de todas as variáveis.
3. Pirâmide de Testes 🏔️
- Testes Unitários (70%): Testam pequenas partes (funções) isoladas. São ultra-rápidos. Rodam no computador (JVM).
- Testes de Integração (20%): Testam a conversa entre componentes (ex: ViewModel + Repositório).
- Testes de UI / Instrumentados (10%): Testam o app rodando no emulador. Clicam em botões, abrem telas. (Ex: Espresso).
4. Escrevendo um Teste Unitário 🧪
Pasta: src/test/java
class CalculadoraTest {
@Test
fun soma_estaCorreta() {
val result = Calculadora().somar(2, 2)
assertEquals(4, result)
}
}
🆚 Comparação: XCTest (iOS)
No iOS, usamos o framework XCTest. A lógica é a mesma: Criar uma classe de teste e usar métodos assert para verificar se o resultado bate com o esperado.
5. Testes de UI com Espresso ☕
O Espresso é a biblioteca padrão para testar a interface.
@Test
fun clicarNoBotao_deveMudarTexto() {
onView(withId(R.id.btnEnviar)).perform(click())
onView(withId(R.id.txtResultado)).check(matches(withText("Enviado!")))
}
6. Gerenciamento de Erros (Try/Catch) 🛡️
Nunca deixe o app fechar sozinho na mão do usuário.
try {
val resultado = 10 / 0
} catch (e: ArithmeticException) {
Log.e("AVISO", "Divisão por zero!", e)
exibirMensagemAmigavel("Ops, algo deu errado.")
}
7. Desafio: O Caçador de Bugs 🕵️♂️
Vou te dar um código com 3 erros. Tente identificar quais são (mentalmente ou no AS):
var lista: List<String>? = null
fun main() {
// Erro 1:
println(lista.size)
// Erro 2:
val num = "123a".toInt()
// Erro 3 (UI):
txtView.text = "Olá" // Tentando atualizar UI dentro de uma Thread comum?
}
Respostas
- NullPointerException: A lista é nula. Deveria usar
lista?.size. - NumberFormatException: A string tem um 'a'. Deveria usar
toIntOrNull(). - CalledFromWrongThreadException: UI só pode ser alterada na Main Thread.
Próxima Aula: Hora de mostrar seu app pro mundo! Publicação na Play Store 🚀