Palestra Testes Unidade Com JUnit

2,803 views
2,703 views

Published on

Palestra sobre técnicas e fases de testes, e informações sobre boas e más práticas comuns ao utilizar JUnit para testes de unidade.
Explica também as principais anotações do framework JUnit, e a anotação disponibilizada na versão 4.7: @Rule

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
2,803
On SlideShare
0
From Embeds
0
Number of Embeds
841
Actions
Shares
0
Downloads
80
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Palestra Testes Unidade Com JUnit

  1. 1. Testes de Unidade com JUnit Robinson Castilho – JUGMS castilho@bacarin.com.br http://www.jugms.com.br
  2. 2. Apresentação ● Robinson Castilho ● Desenvolvedor C++ e Java desde 2001 ● Sun Certified Java Programmer ● Sun Certified Web Component Developer ● Fundador da Bacarin Software ● Instrutor SENAC/MS ● Coordenador do JUGMS
  3. 3. Certa vez fui convidado...
  4. 4. Certa vez fui convidado... Pilotar novo modelo de avião
  5. 5. Avião Moderno
  6. 6. Avião Moderno Bonito
  7. 7. Avião Moderno Bonito Inovador
  8. 8. Avião Moderno Bonito Inovador Econômico
  9. 9. ?
  10. 10. ?
  11. 11. ?
  12. 12. ?
  13. 13. Um detalhe: o avião nunca...
  14. 14. Um detalhe: o avião nunca... TINHA SIDO TESTADO
  15. 15. Olha o Avião
  16. 16. Roubada?
  17. 17. Roubada? SIM
  18. 18. Roubada? SIM
  19. 19. Pense no mundo real
  20. 20. Pense no mundo real Cliente recebe um software:
  21. 21. Pense no mundo real Cliente recebe um software: Moderno
  22. 22. Pense no mundo real Cliente recebe um software: Moderno Inovador
  23. 23. Pense no mundo real Cliente recebe um software: Moderno Inovador Econômico
  24. 24. Pense no mundo real Cliente recebe um software: Moderno Inovador Econômico Nunca foi testado
  25. 25. Roubada?
  26. 26. Roubada? SIM
  27. 27. Teste seu software
  28. 28. Agenda
  29. 29. Agenda ● Importância dos testes
  30. 30. Agenda ● Importância dos testes ● Técnicas e Fases de testes
  31. 31. Agenda ● Importância dos testes ● Técnicas e Fases de testes ● Testes de Unidade
  32. 32. Agenda ● Importância dos testes ● Técnicas e Fases de testes ● Testes de Unidade – Ferramenta JUnit
  33. 33. Agenda ● Importância dos testes ● Técnicas e Fases de testes ● Testes de Unidade – Ferramenta JUnit – Boas e más Práticas
  34. 34. Agenda ● Importância dos testes ● Técnicas e Fases de testes ● Testes de Unidade – Ferramenta JUnit – Boas e más Práticas ● Tomar chopp :)
  35. 35. Dados não mentem
  36. 36. Dados não mentem Erros existem:
  37. 37. Dados não mentem Erros existem: 1/3 poderiam ser evitados
  38. 38. Dados não mentem Erros existem: 1/3 poderiam ser evitados 50% são detectados em produção
  39. 39. Dados não mentem Erros existem: 1/3 poderiam ser evitados 50% são detectados em produção Prejuízo de US$ ~60 bilhões/ano Fonte: http://www.nist.gov/public_affairs/releases/n02-10.htm
  40. 40. Para que serve um teste?
  41. 41. Verificar que uma determinada entrada produz SEMPRE uma mesma saída
  42. 42. Como testar corretamente?
  43. 43. Caixa Preta
  44. 44. Caixa Preta Não se preocupa com o código fonte
  45. 45. Caixa Preta Não se preocupa com o código fonte Saídas são coerentes com as entradas?
  46. 46. Caixa Preta Não se preocupa com o código fonte Saídas são coerentes com as entradas? Equipe testes (normalmente) é diferente da equipe implementação
  47. 47. Caixa Branca
  48. 48. Caixa Branca Trabalha com o código fonte
  49. 49. Caixa Branca Trabalha com o código fonte Avalia aspectos:
  50. 50. Caixa Branca Trabalha com o código fonte Avalia aspectos: ● Teste de condição ● Teste de fluxo de dados ● Teste de ciclos ● Teste de caminho lógico ● Código nunca executado...
  51. 51. Fases: Testes de Unidade
  52. 52. Fases: Testes de Unidade
  53. 53. Fases: Testes de Unidade Testa o código
  54. 54. Fases: Testes de Unidade Testa o código Pequenas unidades
  55. 55. Fases: Testes de Unidade Testa o código Pequenas unidades Independentes
  56. 56. Fases: Testes de Unidade Testa o código Pequenas unidades Independentes (sub-rotinas, trechos)
  57. 57. Teste de Integração
  58. 58. Teste de Integração Testa a integração interna de um sistema
  59. 59. Teste de Integração Testa a integração interna de um sistema Verifica se as peças do quebra-cabeças Estão encaixadas
  60. 60. Teste de Sistema
  61. 61. Teste de Sistema Ponto de vista do cliente final
  62. 62. Teste de Sistema Ponto de vista do cliente final
  63. 63. Teste de Sistema Ponto de vista do cliente final Simular ambiente que o cliente utilizará
  64. 64. Teste de Aceitação
  65. 65. Teste de Aceitação Aprovado ou não?
  66. 66. Teste de Aceitação Aprovado ou não?
  67. 67. Teste de Aceitação Aprovado ou não? Grupo restrito usuários finais simulam o uso em produção
  68. 68. Teste de Aceitação Aprovado ou não? Grupo restrito usuários finais simulam o uso em produção Determina se o sistema satisfaz os critérios estabelecidos
  69. 69. JUnit
  70. 70. JUnit automatizar testes de unidade
  71. 71. JUnit automatizar testes de unidade Open Source
  72. 72. JUnit automatizar testes de unidade Open Source Largamente Utilizado
  73. 73. JUnit automatizar testes de unidade Open Source Largamente Utilizado Criação rápida de testes
  74. 74. JUnit automatizar testes de unidade Open Source Largamente Utilizado Criação rápida de testes Diminuir necessidade de depuração
  75. 75. JUnit automatizar testes de unidade Open Source Largamente Utilizado Criação rápida de testes Diminuir necessidade de depuração Integrável ao Eclipse, Netbeans, Maven...
  76. 76. Utilizando JUnit 4 public class OlaMundoTest { @Test public void testSoma() { assertEquals(10, Calc.soma(7,3)); } }
  77. 77. Relatório no Eclipse
  78. 78. JUnit - Ciclo de vida *DZone RefCardz
  79. 79. @Test Informa que é um método de teste Atributos: ● expected ● timeout
  80. 80. @Before e @After Métodos executados antes e após um método de teste (setUp e tearDown)
  81. 81. @Before e @After Métodos executados antes e após um método de teste (setUp e tearDown) @BeforeClass e @AfterClass Métodos executados antes e após uma classe de teste
  82. 82. Novidades do JUnit 4.7
  83. 83. Novidades do JUnit 4.7 Anotação: @Rule
  84. 84. Novidades do JUnit 4.7 Anotação: @Rule Redefinir e adicionar comportamentos
  85. 85. Novidades do JUnit 4.7 Anotação: @Rule Redefinir e adicionar comportamentos Mecanismo de Meta-testes simples e claro
  86. 86. @Rule ● TemporaryFolder: Permite criar pastas e arquivos que serão automaticamente deletados após o teste public static class HasTempFolder { @Rule public TemporaryFolder folder= new TemporaryFolder(); @Test public void testUsingTempFolder() throws IOException { File createdFile= folder.newFile("myfile.txt"); File createdFolder= folder.newFolder("subfolder"); // ... } }
  87. 87. @Rule ● ExternalResource: Classe base para Rules que necessitam obter recursos externos (socket, conexão com SGBD, etc...) public static class UsesExternalResource { Server myServer = new Server(); @Rule public ExternalResource resource = new ExternalResource() { @Override protected void before() throws Throwable { myServer.connect(); } @Override protected void after() { myServer.disconnect(); }; }; @Test public void testFoo() { new Client().run(myServer); } }
  88. 88. @Rule ● ErrorCollector: Permite que a execução do teste continue, coletando todos os erros ocorridos public static class UsesErrorCollectorTwice { @Rule public ErrorCollector collector= new ErrorCollector(); @Test public void example() { collector.addError(new Throwable("first thing went wrong")); collector.addError(new Throwable("second thing went wrong")); } } ● Veja mais em: http://www.junit.org/node/574
  89. 89. Boas práticas
  90. 90. Boas práticas ● Execute os testes frequentemente
  91. 91. Boas práticas ● Execute os testes frequentemente ● Escreva um teste para o defeito antes de corrigi-lo
  92. 92. Boas práticas ● Execute os testes frequentemente ● Escreva um teste para o defeito antes de corrigi-lo ● Escreva testes, não logs para depuração: – System.out.println(...) – logger.info(...)
  93. 93. Más práticas ● Múltiplos assertions. Evite isso! public class MyTestCase { @Test public void testSomething() { assertEquals(10, Calc.soma(7,3)); assertEquals(50, Calc.multiplica(5,10)); assertEquals(30, Calc.subtrai(50,20)); } }
  94. 94. Más práticas ● Múltiplos assertions. Forma correta: public class MyTestCase { @Test public void testCondition1() { assertEquals(10, Calc.soma(7,3)); } @Test public void testCondition2() { assertEquals(50, Calc.multiplica(5,10)); } @Test public void testCondition3() { assertEquals(30, Calc.subtrai(50,20)); } }
  95. 95. Más práticas ● Método errado. Evite! assertTrue("Os objetos devem ser o mesmo", expected == actual); assertTrue("Os objetos devem ser iguais", expected.equals(actual)); assertTrue("O objeto deve ser nulo", actual == null); assertTrue("O objeto não pode ser nulo", actual != null); Use: assertSame("Os objetos devem ser o mesmo", expected, actual); assertEquals("Os objetos devem ser iguais", expected, actual); assertNull("O objeto deve ser nulo", actual); assertNotNull("O objeto não pode ser nulo", actual);
  96. 96. Más práticas ● Cobertura superficial – Caminho perfeito – Funcionalidades fáceis de testar – Alternativa: Code Coverage Tools
  97. 97. Más práticas ● Testes excessivamente complexos
  98. 98. Más práticas ● Testes excessivamente complexos Refatorar até obter:
  99. 99. Más práticas ● Testes excessivamente complexos Refatorar até obter: 1.Configuração 2.Declaração dos resultados esperados 3.Executar método a ser testado 4.Recuperar resultado 5.Verificar resultado encontrado X esperado
  100. 100. Más práticas ● Capturar exceções Inesperadas public void testCalculation() { try { srv.calculate(); assertEquals(42,srv.getResult()); }catch(CalculationException ex) { Log.error("Calculation caused exception", ex); } }
  101. 101. Más práticas ● Forma correta: Não capture exceções inesperadas public void testCalculation() throw CalculationException { srv.calculate(); assertEquals(42,srv.getResult()); }
  102. 102. Más práticas ● Validando exceções. Forma correta: @Test(expected=IndexOutOfBoundException.class) public void testIndexOutOfBoundsException() { try { ArrayList emptyList = new ArrayList(); Object o = emptyList.get(0); } }
  103. 103. Más práticas
  104. 104. Más práticas Não
  105. 105. Más práticas Não escrever
  106. 106. Más práticas Não escrever Testes !!
  107. 107. Reflexão Final "Todo programador sabe que é capaz de escrever testes para seu código. Poucos escrevem. A resposta universal para a pergunta "porque não?" é "Eu estou muito ocupado". Essa atitude torna-se um ciclo: quanto mais pressão você sente, menos testes você escreve. Quanto menos testes você escreve, menos produtivo você se torna e menos estável seu código fica. Quanto menos produtivo você se torna, mais pressão você sente".* * http://junit.sourceforge.net/doc/testinfected/testing.htm
  108. 108. Sobre o JUGMS ● Grupo de usuários Java do MS ● Forte atuação em Campo Grande ● Participa e promove eventos, palestras e reuniões ● Visite-nos: http://www.jugms.com.br
  109. 109. Sobre o Javaneiros ● Evento sobre todas as vertentes da tecnologia Java ● + de 500 inscritos em 2008 ● Edição 2009 – 14 de novembro de 2009 – Campo Grande/MS – Universidade Unaes – Entrada: 1 kg de alimento – Reservas especiais para caravanas – http://javaneiros.jugms.com.br
  110. 110. Sobre a Bacarin Software ● Residente na Incubadora de Empresas da UNIDERP ● Fornece sistemas web para: – Comércio Eletrônico – Web Sites – Gerenciamento Eletrônico de Documentos ● Visite-nos: http://www.bacarin.com.br
  111. 111. Dúvidas?
  112. 112. Bibliografia ● http://pt.wikipedia.org/wiki/JUnit ● http://www.improveit.com.br/xp/praticas/tdd ● http://www.exubero.com/junit/antipatterns.html ● http://www.guj.com.br/java.tutorial.artigo.40.1.guj ● http://www.junit.org/junit/javadoc/3.8.1/junit/framework/Assert.html ● http://junit.sourceforge.net/doc/testinfected/testing.htm ● http://www-128.ibm.com/developerworks/opensource /library/os-junit/?ca=dgr-lnxw07JUnite ● http://pt.wikipedia.org/wiki/Teste_de_software ● http://www.slideshare.net/jeveaux/* ● http://www.junit.org/node/574
  113. 113. Licença ● Este material está licenciado sob a Licença Creative-Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil ● Você pode: – Copiar, distribuir, exibir e executar a obra – Criar obras derivadas ● Sob as seguintes condições: – Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. – Uso Não-Comercial. Você não pode utilizar esta obra com finalidades comerciais. – Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.

×