2. Sumário
• O que é TDD?
• Três leis do TDD
• Disciplina
• Testes Unitários
• Beneficios
• ABAP Unit
• Setup & Teardown
• Fixtures
• Test Seams & Test Injection
• CDS Test Double Framework
3. O que é TDD?
• Test-Driven Development ou Desenvolvimento guiado por testes
• Desenvolvimento de Software baseado em ciclos curtos:
• Escrever um teste;
• Escrever código que faça o teste passar;
• Refatorar;
• Baseado em testes unitários
4. Três leis do TDD
• Não é permitido escrever nenhum código produtivo a menos que seja para
fazer um teste unitário passar;
• Não é permitido escrever mais que um teste unitário que seja suficiente para
falhar; erro de compilação é uma falha
• Não é permitido escrever mais código produtivo do que o necessário para
fazer um teste unitário passar;
6. Testes Unitários
• Teste Unitário ou Teste de Unidade são testes escritos para testar a
menor parte testável de um software, ou unidade.
• Como menor parte testável podemos ter uma classe ou os seus
métodos
• Testes unitários devem ser:
• Independentes
• Isolados
• Concisos
• Testes unitários são baseados em afirmações (assertions)
7. Benefícios
• Feedback mais rápido
• Reduz tempo de debug
• Reduz retrabalho
• Modularização
• Qualidade
• Segurança nas alterações
• Confiança no deploy
8. ABAP Unit
• Framework de teste unitário do ABAP;
• Presente desde o NW 6.40 (2004)
• Aderente ao xUnit;
• Classe CL_AUNIT_ASSERT – até releases 7.01
• Classe CL_ABAP_UNIT_ASSERT – releases >= 7.02
9. ABAP Unit: Classe de Teste – Definição
class lcl_class_test definition
"indica que a classe é de teste
for testing
"define o nível de risco da classe de teste: CRITICAL|DANGEROUS|HARMLESS
risk level harmless
"duração dos testes: SHORT|MEDIUM|LONG
duration short.
public section.
public section.
methods: test_method for testing.
endclass.
15. ABAP Unit: Coverage Test
• Indica o nível de cobertura do seu código de teste;
• No Eclipse, botão direito sobre o código -> Coverage As -> ABAP Unit
Test;
17. Setup & Teardown
• Métodos auxiliares da classe de teste p/ auxiliar a
inicialização/finalização dos testes
• Método de instância setup, executado antes de cada método de
teste;
• Método de instância teardown, executado após cada método de
teste;
• Método estático class_setup, executado apenas uma vez, antes de
todos os métodos de teste;
• Método estático class_teardown, executado apenas uma vez, depois
que todos os métodos de teste foram executados;
18. Setup & Teardown
class lcl_contaBancaria_test definition
for testing
risk level harmless
duration short.
private section.
data: lo_conta type ref to lcl_contabancaria.
methods: setup,
testDeposito for testing.
endclass.
class lcl_contaBancaria_test implementation.
method setup.
create object lo_conta.
endmethod.
method testDeposito.
lo_conta->deposito( 50 ).
cl_abap_unit_assert=>assert_equals(
exporting
ACT = lo_conta->saldo
EXP = 50
).
endmethod.
endclass.
19. Test Seams & Test Injection
• Test seams são áreas de código demarcadas para substituição por um
Test Injection;
• Test Injection são áreas de código presentes em classes de teste que
substituem o código presente em áreas demarcadas como Test Seams
• Ideal p/ código legado
• Presente desde ABAP 7.50
20. Test Seams & Test Injection
• Exemplos:
• Simular acesso a recursos externos, como banco de dados, arquivos,
interfaces, etc;
• Testar cenários de erro complexos, com exceções específicas;
• Ignorar ou eliminar código que não está sob teste ou não deve ser testado –
authority-checks, chamadas ao GUI, etc;
21. Test Seams & Test Injection
Simular acesso ao banco de dados
23. Test Seams & Test Injection
Usar o Test Injection
24. CDS Test Double Framework
• Disponível a partir do NW AS ABAP 7.51
• https://blogs.sap.com/2016/10/19/introduction-cds-test-double-
framework-write-unit-tests-abap-cds-entities/
26. Referências:
• Test Driven Development – By Example – by Kent Beck
https://www.amazon.com/Test-Driven-Development-By-
Example/dp/0321146530
• Test Driven Development by Robert Martin
https://www.youtube.com/watch?v=qmS4ojQ1Pa8
• Test Seams & Test Injection by Horst Keller
https://blogs.sap.com/2015/10/23/abap-news-for-750-test-seams-and-
injections/
• Introduction to CDS Test Doubles by Sunil Bandameedapalli
https://blogs.sap.com/2016/10/19/introduction-cds-test-double-
framework-write-unit-tests-abap-cds-entities/
Editor's Notes
É bom ser bom no debug?
Programação orientada ao medo: porque tememos mudanças no código?
Don’t live with broken windows
TDD p/ novos desenvolvimentos
Documentação através do código: código que documenta o códigoTDD e acesso a BD;
Feedback Rapido = TDD permite que o desenvolvedor tenha uma resposta ou retorno mais rápido ao codificar e executar os testes.
Reduz tempo de Debug porque teremos menos erros, já que a aplicação é testada antes mesmo de ser desenvolvida
Reduz retrabalho por diminuir a quantidade de problemas durante o desenvolvimento, assim como pelo design simplificado das mesmas
Modularização, seguindo o conceito SOLID, SRP – Single Responsibility Principle – cada classe e método terá apenas uma função específica – You Have One Job
Qualidade – Mais testes garantem uma maior qualidade da aplicação sendo desenvolvida
Segurança na Alteração – Os testes funcionam como uma rede de segurança ao fazer qualquer alteração. Você consegue rápidamente descobrir se sua alteração ”quebrou” algum outro ponto da aplicação ou gerou algum tipo de regressão;
Confiança no deploy – Erros ainda podem existir, mesmo após a execução com sucesso dos testes unitários, mas com certeza o seu número será reduzido, com menos chance de encontrar erros simples ou de funcionalidade não conforme a especificação e com isso, maior confiança na hora do deploy (ou transporte p/ qualidade/produção).
xUnit é o conjunto de testes unitários de diversas linguagens de programação que são baseados no SUnit, framework de testes unitários desenvolvido por Kent Beck para SmallTalk. Após o SmallTalk, ele foi portado pelo Kent Beck e Erich Gamma p/ Java, dando origem ao JUnit.
Risk Level indica o risco que a classe de testes representa ao sistema. Com isso, o teste pode ou não ser executado, baseado em parâmetro da instância do sistema
Duration indica se teste é executado de forma rápida ou demorada.
Métodos de teste são gerados e executados apenas em sistemas não produtivos, onde o parâmetro de profile abap/test_generation é true