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

51
Testes unitários como ferramentas de design de código Caipyra - 26 de Junho de 2016

Upload: paula-grangeiro

Post on 15-Apr-2017

167 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Testes unitários como ferramentas de design de código

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

Caipyra - 26 de Junho de 2016

Page 2: Testes unitários como ferramentas de design de código

Paula Grangeiro

28 anos

Bacharel em Sistemas de Informação

Duque de Caxias

Gateira

Python & Arquitetura de Software

Page 4: Testes unitários como ferramentas de design de código

Por que pensar em design de código?

Page 5: Testes unitários como ferramentas de design de código

Problemas do mundo real

Page 6: Testes unitários como ferramentas de design de código

Problemas do mundo real

Page 7: Testes unitários como ferramentas de design de código
Page 8: Testes unitários como ferramentas de design de código
Page 9: Testes unitários como ferramentas de design de código
Page 10: Testes unitários como ferramentas de design de código
Page 11: Testes unitários como ferramentas de design de código

+ Coesão- Acoplamento

Page 12: Testes unitários como ferramentas de design de código

+ CoesãoDesenvolver estruturas de código especialistas ao máximo naquilo que fazem e que colaboram entre si para o funcionamento do sistema.

Page 13: Testes unitários como ferramentas de design de código

- AcoplamentoDesenvolver 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.

Page 14: Testes unitários como ferramentas de design de código
Page 15: Testes unitários como ferramentas de design de código

BAD SMELL

Page 16: Testes unitários como ferramentas de design de código

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.

Page 17: Testes unitários como ferramentas de design de código

Lidando com bad smells

Page 18: Testes unitários como ferramentas de design de código

“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

Page 19: Testes unitários como ferramentas de design de código

Design PatternsPadrões de Projeto

Page 20: Testes unitários como ferramentas de design de código

GoFAbstract 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

Page 21: Testes unitários como ferramentas de design de código

Aprendendo Design Patterns

Page 22: Testes unitários como ferramentas de design de código

Design Patterns não são uma bala de prata

Page 23: Testes unitários como ferramentas de design de código

Testes Unitários

Page 24: Testes unitários como ferramentas de design de código

Testes unitáriosVerificar o funcionamento de um fluxo garantindo que, a partir de uma entrada, uma saída esperada seja reproduzida.

Page 25: Testes unitários como ferramentas de design de código

Testes Unitários

2, 1 def soma (a, b): return a + b 3

entrada saída

Page 26: Testes unitários como ferramentas de design de código

Testes Unitários

from unittest import TestCaseimport soma

class SomaTestCase(TestCase):

def test_sums_params_correctly(self): expected = 3 value = soma(2, 1) self.assertEqual(expected, value)

Page 27: Testes unitários como ferramentas de design de código

Libs para Testes Unitários

● Unittest● Py.test● Doctest

Page 28: Testes unitários como ferramentas de design de código

Testes unitários como ferramentas de design?

Page 29: Testes unitários como ferramentas de design de código

1. Pratique TDD

Page 30: Testes unitários como ferramentas de design de código

Ciclo do TDD

Page 31: Testes unitários como ferramentas de design de código

Como pensar em TDD?

Page 32: Testes unitários como ferramentas de design de código

Praticar TDDAuxilia 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

Page 33: Testes unitários como ferramentas de design de código

2. TestCases devem ser pequenas

Page 34: Testes unitários como ferramentas de design de código
Page 35: Testes unitários como ferramentas de design de código
Page 36: Testes unitários como ferramentas de design de código
Page 37: Testes unitários como ferramentas de design de código
Page 38: Testes unitários como ferramentas de design de código
Page 39: Testes unitários como ferramentas de design de código

AnalisarTestCases

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.

Page 40: Testes unitários como ferramentas de design de código

3. Testes unitários devem ser unitários

Page 41: Testes unitários como ferramentas de design de código

Testar unitariamente fluxos alteranativos

a, bdef soma (a, b): if not a is None or b is None: # Raise return a + b

entradapossível saída: soma

possível saída: exceção

Page 42: Testes unitários como ferramentas de design de código

Testar unitariamente fluxos alternativos

from unittest import TestCaseimport somaimport 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)

Page 43: Testes unitários como ferramentas de design de código

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

Page 44: Testes unitários como ferramentas de design de código

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.

Page 45: Testes unitários como ferramentas de design de código

4. Testes unitários devem ser isolados

Page 46: Testes unitários como ferramentas de design de código

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

Page 47: Testes unitários como ferramentas de design de código

Fluxos externos devem ser isolados

from unittest import TestCaseimport delta

class DeltaTestCase(TestCase):

def test_calcs_delta_correctly(self): expected = 4 value = delta(4, 6, -1)

self.assertEqual(expected, value)

Page 48: Testes unitários como ferramentas de design de código

from mock import patch, Mockfrom unittest import TestCaseimport 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))

Page 49: Testes unitários como ferramentas de design de código

Isolar fluxos externos

Evita que o comportamento inesperado de um componente externo do fluxo testado influencie no seu resultado

Page 50: Testes unitários como ferramentas de design de código

Less is more

Page 51: Testes unitários como ferramentas de design de código

Obrigada!

mail: [email protected]

site: www.paulagrangeiro.com.br

github: @pgrangeiro

twitter: @paulagrangeiro

face: fb.me/paula.grangeiro