TDD com ABAP
Por José Nunes
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
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
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;
Disciplina
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)
Benefícios
• Feedback mais rápido
• Reduz tempo de debug
• Reduz retrabalho
• Modularização
• Qualidade
• Segurança nas alterações
• Confiança no deploy
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
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.
ABAP Unit: CL_ABAP_UNIT_ASSERT
• ASSERT_BOUND / ASSERT_NOT_BOUND
• ASSERT_EQUALS / ASSERT_DIFFERS
• ASSERT_EQUALS_FLOAT
• ASSERT_CHAR_CP / ASSERT_CHAR_NP
• ASSERT_INITIAL / ASSERT_NOT_INITIAL
• ASSERT_TRUE / ASSERT_FALSE
• ASSERT_TABLE_CONTAINS / ASSERT_TABLE_NOT_CONTAINS
• ASSERT_NUMBER_BETWEEN
• ASSERT_TEXT_MATCHES
• ASSERT_SUBRC
• ASSERT_THAT
ABAP Unit: Executando o teste
• No Eclipse:
ABAP Unit: Executando o teste
• No SAP GUI:
ABAP Unit: Resultado da Execução
• Sucesso:
ABAP Unit: Resultado da Execução
• Erro:
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;
ABAP Unit: Coverage Test
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;
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.
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
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;
Test Seams & Test Injection
Simular acesso ao banco de dados
Test Seams & Test Injection
Definir Test Seam
Test Seams & Test Injection
Usar o Test Injection
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/
Perguntas?
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/

SITSP Developers 2016 - ABAP c/ TDD

  • 1.
    TDD com ABAP PorJosé Nunes
  • 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 doTDD • 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;
  • 5.
  • 6.
    Testes Unitários • TesteUnitá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 maisrápido • Reduz tempo de debug • Reduz retrabalho • Modularização • Qualidade • Segurança nas alterações • Confiança no deploy
  • 8.
    ABAP Unit • Frameworkde 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: Classede 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.
  • 10.
    ABAP Unit: CL_ABAP_UNIT_ASSERT •ASSERT_BOUND / ASSERT_NOT_BOUND • ASSERT_EQUALS / ASSERT_DIFFERS • ASSERT_EQUALS_FLOAT • ASSERT_CHAR_CP / ASSERT_CHAR_NP • ASSERT_INITIAL / ASSERT_NOT_INITIAL • ASSERT_TRUE / ASSERT_FALSE • ASSERT_TABLE_CONTAINS / ASSERT_TABLE_NOT_CONTAINS • ASSERT_NUMBER_BETWEEN • ASSERT_TEXT_MATCHES • ASSERT_SUBRC • ASSERT_THAT
  • 11.
    ABAP Unit: Executandoo teste • No Eclipse:
  • 12.
    ABAP Unit: Executandoo teste • No SAP GUI:
  • 13.
    ABAP Unit: Resultadoda Execução • Sucesso:
  • 14.
    ABAP Unit: Resultadoda Execução • Erro:
  • 15.
    ABAP Unit: CoverageTest • 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;
  • 16.
  • 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 classlcl_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
  • 22.
    Test Seams &Test Injection Definir Test Seam
  • 23.
    Test Seams &Test Injection Usar o Test Injection
  • 24.
    CDS Test DoubleFramework • 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/
  • 25.
  • 26.
    Referências: • Test DrivenDevelopment – 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/

Notas do Editor

  • #3 É 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ódigo TDD e acesso a BD;
  • #8 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).
  • #9 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.
  • #10 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