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

34
Testes unitários como ferramentas de design de código I GruPy Grande Rio - 2 de abril de 2016

Upload: paula-grangeiro

Post on 11-Jan-2017

93 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

I GruPy Grande Rio - 2 de abril de 2016

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

Paula Grangeiro Programadora por profissão,

desenhista nas horas vagas e

colecionadora de gatos.

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

Ministério da procrastinação adverte:

Os fatos relatados durante esta apresentação são baseados em experiências pessoais.

Utilize-os com moderação.

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

Por que pensar em Design de Código?

Page 6: Testes unitários como ferramentas de design de código
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

Código Mogwai

Page 11: 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 12: Testes unitários como ferramentas de design de código

Testes unitários

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

def foo(arg):if arg:

return ‘It has an argument!’return ‘Nope!’

Pequena função Python com dois

possíveis fluxos a partir da

validação do argumento

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

Testes unitários que cobrem os

possíveis fluxos da função foo

class FooTestCase(TestCase):def test_foo_returns_correct_value_when_arg_is_true(self):

message = foo(True)self.assertEqual(‘It has an argument!’, message)

def test_foo_returns_correct_value_when_arg_is_false(self):message = foo(False)self.assertEqual(‘Nope!’, message)

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

class FooTestCase(TestCase):def test_foo_returns_correct_value_when_arg_is_true(self):

message = foo(True)self.assertEqual(‘It has an argument!’, message)

def test_foo_returns_correct_value_when_arg_is_false(self):message = foo(False)self.assertEqual(‘Nope!’, message)

def foo(arg):if arg:

return ‘It has an argument!’return ‘Nope!’

Page 16: Testes unitários como ferramentas de design de código
Page 17: Testes unitários como ferramentas de design de código
Page 18: Testes unitários como ferramentas de design de código
Page 19: Testes unitários como ferramentas de design de código
Page 20: Testes unitários como ferramentas de design de código
Page 21: Testes unitários como ferramentas de design de código

Então o que há de errado com o nosso código?

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

Padrões de ProjetoDesign Patterns

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

Padrões de Projeto

● GoF

● GRASP

● SOLID

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

Indicação de estudo

● Padrões de Projeto - Soluções Reutilizáveis de Software Orientado a Objetos● Utilizando UML e Padrões● Código limpo● Curso Python Patterns - Luciano Ramalho

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

Testes unitários como ferramenta de design

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

class CrateIncomeTaxTestCase(TestCase):

def test_method_calcs_exemption_corrctly

(self):

```

teste para rendimento < 25661.7

```

def test_method_calcs_taxes_correctly(self):

```

teste para rendimento > 25661.7

```

def test_method_creates_file_correctly(self):

```

teste que valida criacao do arquivo

```

Teste unitariamente o seu código

def create_income_tax(income):tax = 0if income < 25661.7:

```codigo calculo do imposto isento```

else:```codigo calculo do imposto```

f = open('income_tax_file', 'w')f.write(tax)f.close()

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

class CreateIncomeTaxTestCase(TestCase):

def test_method_calls_calculate_tax(self):

```

teste para chamada do calcular imposto

```

def test_method_calls_create_file(self):

```

teste para chamada do criar arquivo

```

class CalculateTaxTestCase(TestCase):

def test_method_calcs_exemption_correctly

(self):

```

teste para rendimento < 25661.7

```

def test_method_calcs_taxes_correctly(self):

```

teste para rendimento >= 25661.7

```

class CreateFileTestCase(TestCase):

def test_method_creates_file_correctly(self):

```

teste que valida criacao do arquivo

```

Teste unitariamente o seu código

def create_income_tax(rendimento):tax = calculate_tax(rendimento)income_tax_file = create_file(valor_imposto)

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

class PatientTestCase(TestCase):

def test_save_patient_correctly(self):```codigo que testa se o paciente foi salvo corretamente```

def test_save_raises_exception_if_patient_with_same_cpf_already_exists(self):```codigo que testa se foi levantada excecao quando paciente com cpf ja existe```patient_1 = Patient(cpf=’12121212108’)patient_1.save()

patient_2 = Patient(cpf=’12121212108’)self.assertRaises(PatientAlreadyExistsException, patient_2.save)

Teste fluxos de sucesso e erro separadamente

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

class CalculateTaxTestCase(TestCase):

def test_method_calcs_taxes_when_income_less_than_margin(self):expected_value = 0income = 25000

taxes = calculate_tax(income)

self.assertEqual(expected_value, taxes)

def test_method_calcs_taxes_when_income_equal_or_greater_than_margin(self):expected_value = 432.6income = 26000

taxes = calculate_tax(income)

self.assertEqual(expected_value, taxes)

Nomeie os testes de acordo com o fluxo testado

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

from mock import patchfrom unittest import TestCase

from diretorio.arquivo import create_income_tax

class CreateIncomeTaxTestCase(TestCase):

@patch(‘diretorio.arquivo.calculate_tax’)def test_method_calls_calculate_tax(self, mocked_calculate_tax):

create_income_tax(1)self.assertTrue(mocked_calculate_tax.called)

@patch(‘diretorio.arquivo.create_file’)def test_method_calls_create_file(self, mocked_create_file):

create_income_tax(1)self.assertTrue(mocked_create_file.called)

Testes devem ser isolados!

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

TDD

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

Funcionamento do Dojo

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

● DTM todas as quartas

● Colworking todas as segundas

[email protected]

Dojos no Rio