Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Testes unitários como ferramentas de design de código

328 views

Published on

Apresentação exibida no I Caipyra de Ribeirão Preto

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Testes unitários como ferramentas de design de código

  1. 1. Testes unitários como ferramentas de design de código Caipyra - 26 de Junho de 2016
  2. 2. Paula Grangeiro 28 anos Bacharel em Sistemas de Informação Duque de Caxias Gateira Python & Arquitetura de Software
  3. 3. Onde me encontrar...
  4. 4. Por que pensar em design de código?
  5. 5. Problemas do mundo real
  6. 6. Problemas do mundo real
  7. 7. + Coesão - Acoplamento
  8. 8. + Coesão Desenvolver estruturas de código especialistas ao máximo naquilo que fazem e que colaboram entre si para o funcionamento do sistema.
  9. 9. - Acoplamento Desenvolver estruturas de código isoláveis de maneira que a alteração ou remoção de um componente impacte o mínimo possível no sistema.
  10. 10. BAD SM ELL
  11. 11. Bad smell do dia-a-dia ● Código duplicado ● Complexidade desnecessária ● Linhas de código muito extensas ● Feature envy ● Intimidade inapropriada ● Classes preguiçosas ● Conascência ● Dowcasting ● Muitos parâmetros ● Nomes de variáveis muito longos ● Nomes de variáveis muito curtos ● Comentários muito longos ● Comentários desatualizados ● Variáveis órfãs ● etc.
  12. 12. Lidando com bad smells
  13. 13. “Escrever código limpo é o que você deve fazer para que possa se intitular como profissional. Não existem desculpas plausíveis para fazer menos do que o seu melhor.” - Uncle Bob em Código Limpo
  14. 14. Design Patterns Padrões de Projeto
  15. 15. GoF Abstract Factory Builder Factory Method Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor
  16. 16. Aprendendo Design Patterns
  17. 17. Design Patterns não são uma bala de prata
  18. 18. Testes Unitários
  19. 19. Testes unitários Verificar o funcionamento de um fluxo garantindo que, a partir de uma entrada, uma saída esperada seja reproduzida.
  20. 20. Testes Unitários 2, 1 def soma (a, b): return a + b 3 entrada saída
  21. 21. Testes Unitários from unittest import TestCase import soma class SomaTestCase(TestCase): def test_sums_params_correctly(self): expected = 3 value = soma(2, 1) self.assertEqual(expected, value)
  22. 22. Libs para Testes Unitários ● Unittest ● Py.test ● Doctest
  23. 23. Testes unitários como ferramentas de design?
  24. 24. 1. Pratique TDD
  25. 25. Ciclo do TDD
  26. 26. Como pensar em TDD?
  27. 27. Praticar TDD Auxilia no processo de definição do fluxo do código a partir do momento que você define as APIs de chamadas antes de implementá-las
  28. 28. 2. TestCases devem ser pequenas
  29. 29. Analisar TestCases Auxilia na identificação de responsabilidades da classe testada, e possíveis bad smells, contribuindo com a coesão e diminuição do acoplamento do código que será desenvolvido.
  30. 30. 3. Testes unitários devem ser unitários
  31. 31. Testar unitariamente fluxos alteranativos a, b def soma (a, b): if not a is None or b is None: # Raise return a + b entrada possível saída: soma possível saída: exceção
  32. 32. Testar unitariamente fluxos alternativos from unittest import TestCase import soma import SomeCustomException class SomaTestCase(TestCase): def test_sums_params_correctly(self): expected = 3 value = soma(2, 1) self.assertEqual(expected, value) def test_sum_raises_exception_when_some_param_has_is_none(self): self.assertRaises(SomeCustomException, soma, 2, None)
  33. 33. Testar unitariamente fluxos alternativos def eq_segundo_grau (a, b, c): delta = eq_delta(a, b, c) x1 = (-b + sqrt(delta, 2)) / (2*a) x2 = (-b - sqrt(delta, 2)) / (2*a) return x1, x2entrada saída Fluxo alternativo
  34. 34. Pensar unitáriamente Auxilia no processo descoberta de fluxos de comportamento, também ajudando a manter a coesão e diminuição do acoplamento do código de menores unidades, como métodos de instância.
  35. 35. 4. Testes unitários devem ser isolados
  36. 36. Fluxos externos devem ser isolados def eq_segundo_grau (a, b, c): delta = eq_delta(a, b, c) x1 = (-b + sqrt(delta, 2)) / (2*a) x2 = (-b - sqrt(delta, 2)) / (2*a) return x1, x2entrada saída Fluxo alternativo
  37. 37. Fluxos externos devem ser isolados from unittest import TestCase import delta class DeltaTestCase(TestCase): def test_calcs_delta_correctly(self): expected = 4 value = delta(4, 6, -1) self.assertEqual(expected, value)
  38. 38. from mock import patch, Mock from unittest import TestCase import eq_segundo_grau class EqTestCase(TestCase): @patch(‘delta’, Mock(return_value=2) def test_calcs_x_params_correctly(self, mocked_delta): expected = 5, 8 x1, x2 = eq_segundo_grau(3, -7, 1) mocked_delta.assert_called_once_with(3, -7, 1) self.assertEqual(expected, (x1, x2))
  39. 39. Isolar fluxos externos Evita que o comportamento inesperado de um componente externo do fluxo testado influencie no seu resultado
  40. 40. Less is more
  41. 41. Obrigada! mail: contato@paulagrangeiro.com site: www.paulagrangeiro.com.br github: @pgrangeiro twitter: @paulagrangeiro face: fb.me/paula.grangeiro

×