App Android de calculadora desenvolvido como resolução do desafio de TDD da DIO. A lógica foi construída com testes antes da implementação e a interface coberta com Espresso.
O app soma, subtrai, multiplica e divide, mantém um histórico das operações e trata divisão por zero.
Nota: o curso usa um app de tarefas como exemplo; optei por uma calculadora por ter lógica de domínio mais rica, o que permite cobrir também testes unitários puros em Kotlin além dos testes de UI com Espresso.
- Kotlin
- JUnit para testes unitários (rodam na JVM)
- Espresso para testes de UI (rodam no emulador)
- Robot Pattern para organizar as interações de tela
app/src/
├── main/
│ ├── Calculadora.kt # lógica de cálculo, sem dependência de Android
│ └── MainActivity.kt # tela que liga os botões à Calculadora
├── test/
│ └── CalculadoraTest.kt # testes unitários da lógica
└── androidTest/
├── CalculadoraRobot.kt # interações de UI encapsuladas
└── MainActivityTest.kt # testes Espresso
A lógica está isolada da interface: a classe Calculadora não conhece Android, o que permite testar tudo na JVM sem precisar de emulador.
Testes unitários:
./gradlew testTestes de UI (com emulador aberto):
./gradlew connectedDebugAndroidTestInstalar o app no emulador ou device conectado:
./gradlew installDebugTestes unitários (JVM):
- Soma, subtração, multiplicação e divisão
- Exceção em divisão por zero
- Registro de operações no histórico
Testes de UI (Espresso):
- Digitar dois números, clicar numa operação e conferir o resultado no display
- Histórico atualizado após a operação
- Mensagem de erro ao dividir por zero
Os testes de UI usam uma classe CalculadoraRobot que encapsula as interações com a tela:
robot
.digitaA("2")
.digitaB("3")
.clicaSomar()
.verificaResultado("5.0")Com isso, os testes ficam legíveis e resistem a mudanças de layout. Se um id de view mudar, basta ajustar o Robot.
Cada método da Calculadora foi escrito a partir de um teste que falhava. O histórico de commits mostra essa sequência: para cada operação existem dois commits, um do teste (vermelho) e outro da implementação (verde).