🧪 Testes Unitários (ABAP Unit)
Aprenda a criar testes automatizados em ABAP para garantir qualidade, facilitar refatoração e documentar comportamento esperado do código.
📖 O que vais aprender
- ABAP Unit Framework
- Estruturar classes de teste
- Assertions e verificações
- Test Doubles (Mocks e Stubs)
- Injeção de dependências
- Code Coverage
- Test-Driven Development (TDD)
- Boas práticas de testes
🎯 Por que Testar?
Benefícios
✅ Detectar bugs cedo - Antes de chegar a produção
✅ Refatoração segura - Alterar código com confiança
✅ Documentação viva - Testes mostram como usar o código
✅ Design melhor - Código testável é código bem estruturado
✅ Menos debugging - Testes automatizam verificações
✅ Regressão - Garantir que correções não quebram funcionalidades
📚 Tópicos
1️⃣ ABAP Unit Básico
Primeiros passos com ABAP Unit.
- Anatomia de uma classe de teste
- Atributos
FOR TESTING,RISK LEVEL,DURATION - Criar primeiro teste
- Executar testes (Ctrl+Shift+F10)
- Interpretar resultados
2️⃣ Test Fixtures
Preparar e limpar ambiente de teste.
- Métodos setup() e teardown()
- class_setup() e class_teardown()
- Ciclo de vida dos testes
- Dados de teste reutilizáveis
3️⃣ Assertions
Verificações e validações em testes.
- assert_equals / assert_not_equals
- assert_initial / assert_not_initial
- assert_bound / assert_not_bound
- assert_true / assert_false
- assert_subrc
- assert_table_contains
- Mensagens personalizadas
4️⃣ Test Doubles e Mocking
Isolar código sob teste.
- O que são Test Doubles
- ABAP Test Double Framework
- Mockar dependências
- Stubs vs Mocks vs Fakes
- configure_call() e times()
5️⃣ Injeção de Dependências
Tornar código testável.
- Princípio de Inversão de Dependência
- Interfaces para desacoplamento
- Constructor Injection
- Setter Injection
- Exemplos práticos
6️⃣ Cobertura de Código
Medir qualidade dos testes.
- O que é Code Coverage
- Visualizar no Eclipse ADT
- Coverage Analyzer (SCOV)
- Metas de cobertura (70-80%)
- Statement vs Branch coverage
7️⃣ TDD - Test Driven Development
Desenvolver orientado a testes.
- Ciclo Red-Green-Refactor
- Escrever teste antes do código
- Baby steps
- Vantagens e desvantagens
- Exemplo completo TDD
🚀 Exemplo Rápido
Classe a Testar
CLASS zcl_calculator DEFINITION PUBLIC.
PUBLIC SECTION.
METHODS add
IMPORTING iv_a TYPE i
iv_b TYPE i
RETURNING VALUE(rv_result) TYPE i.
ENDCLASS.
CLASS zcl_calculator IMPLEMENTATION.
METHOD add.
rv_result = iv_a + iv_b.
ENDMETHOD.
ENDCLASS.
Classe de Teste
CLASS ltc_calculator DEFINITION FOR TESTING
RISK LEVEL HARMLESS
DURATION SHORT.
PRIVATE SECTION.
DATA: mo_cut TYPE REF TO zcl_calculator. " Class Under Test
METHODS:
setup,
test_add_positive_numbers FOR TESTING.
ENDCLASS.
CLASS ltc_calculator IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_cut.
ENDMETHOD.
METHOD test_add_positive_numbers.
" Arrange (preparar)
DATA(lv_a) = 5.
DATA(lv_b) = 3.
" Act (executar)
DATA(lv_result) = mo_cut->add( iv_a = lv_a iv_b = lv_b ).
" Assert (verificar)
cl_abap_unit_assert=>assert_equals(
act = lv_result
exp = 8
msg = 'Soma de 5 + 3 deveria ser 8' ).
ENDMETHOD.
ENDCLASS.
Executar: Ctrl+Shift+F10 (Eclipse) ou F9 (SAP GUI)
🛠️ Ferramentas
Eclipse ADT (Recomendado)
- Ctrl+Shift+F10: Executar testes
- Ctrl+Shift+F11: Executar com coverage
- View de resultados integrada
- Coverage destacado no código
SAP GUI
- SE80/SE24: Editar classe
- F9: Executar testes (Unit Test)
- F8: Coverage Analyzer (SCOV)
⚡ Boas Práticas
✅ Fazer
" 1. Nomes descritivos
METHOD test_add_returns_sum_of_two_numbers.
" 2. Arrange-Act-Assert pattern
METHOD test_something.
" Arrange - preparar dados
DATA(lv_input) = 'test'.
" Act - executar ação
DATA(lv_result) = mo_cut->process( lv_input ).
" Assert - verificar resultado
cl_abap_unit_assert=>assert_equals( act = lv_result exp = 'expected' ).
ENDMETHOD.
" 3. Um conceito por teste
METHOD test_validate_email_valid.
" Testa APENAS emails válidos
ENDMETHOD.
METHOD test_validate_email_invalid.
" Testa APENAS emails inválidos (teste separado)
ENDMETHOD.
" 4. Usar setup para código comum
METHOD setup.
CREATE OBJECT mo_cut.
mo_cut->set_config( 'test_mode' ).
ENDMETHOD.
" 5. Mensagens claras
cl_abap_unit_assert=>assert_equals(
act = lv_count
exp = 5
msg = |Esperado 5 itens, mas encontrou { lv_count }| ).
❌ Evitar
" 1. Testes dependentes
METHOD test_step1.
mo_cut->create_order( ). " ❌ test_step2 depende deste
ENDMETHOD.
METHOD test_step2.
mo_cut->process_order( ). " ❌ Falha se test_step1 não executou
ENDMETHOD.
" 2. Testar implementação, não comportamento
cl_abap_unit_assert=>assert_equals(
act = mo_cut->mv_internal_counter " ❌ Detalhe de implementação
exp = 3 ).
" 3. Testes sem assertions
METHOD test_something.
mo_cut->process( ). " ❌ Não verifica nada!
ENDMETHOD.
" 4. Muitas responsabilidades num teste
METHOD test_everything.
" Testa validação, processamento, gravação... ❌
ENDMETHOD.
" 5. Ignorar testes falhando
" ❌ Testes devem SEMPRE passar em produção
🎓 Estatísticas de Qualidade
Metas Recomendadas
| Métrica | Meta | Crítico |
|---|---|---|
| Code Coverage | 70-80% | >60% |
| Testes passando | 100% | 100% |
| Tempo execução | <5 min | <10 min |
| Testes por classe | 5-15 | >3 |
🔗 Próximos Passos
- Comece com ABAP Unit Básico - Primeiro teste
- Aprenda Assertions - Verificações essenciais
- Pratique Test Fixtures - Setup e teardown
- Domine Test Doubles - Isolar dependências
- Estude Injeção de Dependências - Código testável
- Meça com Code Coverage - Qualidade dos testes
- Experimente TDD - Teste antes do código
Tags: #Testing #ABAP-Unit #TDD #Quality #Best-Practices