SlideShare uma empresa Scribd logo
1 de 51
Baixar para ler offline
Testes unitários como
ferramentas de design de
código
Caipyra - 26 de Junho de 2016
Paula Grangeiro
28 anos
Bacharel em Sistemas de Informação
Duque de Caxias
Gateira
Python & Arquitetura de Software
Onde me encontrar...
Por que pensar em
design de código?
Problemas do mundo real
Problemas do mundo real
+ Coesão
- Acoplamento
+ Coesão
Desenvolver estruturas de código
especialistas ao máximo naquilo que
fazem e que colaboram entre si para
o funcionamento do sistema.
- 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.
BAD
SM
ELL
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.
Lidando com bad smells
“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
Design Patterns
Padrões de Projeto
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
Aprendendo Design Patterns
Design Patterns não são
uma bala de prata
Testes Unitários
Testes unitários
Verificar o funcionamento de um
fluxo garantindo que, a partir de uma
entrada, uma saída esperada seja
reproduzida.
Testes Unitários
2, 1 def soma (a, b):
return a + b 3
entrada saída
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)
Libs para Testes Unitários
● Unittest
● Py.test
● Doctest
Testes unitários
como ferramentas
de design?
1. Pratique TDD
Ciclo do TDD
Como pensar em TDD?
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
2. TestCases devem ser
pequenas
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.
3. Testes unitários devem
ser unitários
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
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)
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
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.
4. Testes unitários devem
ser isolados
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
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)
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))
Isolar fluxos
externos
Evita que o comportamento
inesperado de um componente
externo do fluxo testado influencie
no seu resultado
Less is more
Obrigada!
mail: contato@paulagrangeiro.com
site: www.paulagrangeiro.com.br
github: @pgrangeiro
twitter: @paulagrangeiro
face: fb.me/paula.grangeiro

Mais conteúdo relacionado

Mais procurados

Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comandogarux
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPressRudá Almeida
 
O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019Cassio Santos
 
Poo1 aula 3 - java - comentários instruções e blocos-palavras chave
Poo1   aula 3 - java - comentários instruções e blocos-palavras chavePoo1   aula 3 - java - comentários instruções e blocos-palavras chave
Poo1 aula 3 - java - comentários instruções e blocos-palavras chaveDenis Sobrenome
 
10+ Coisas Que Odeio Em Php
10+ Coisas Que Odeio Em Php10+ Coisas Que Odeio Em Php
10+ Coisas Que Odeio Em PhpAlmir Mendes
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Testes de integração em microservices
Testes de integração em microservicesTestes de integração em microservices
Testes de integração em microservicesClaudenir Freitas
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyGilson Filho
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.netAndre Nascimento
 
Testes e depuração de código com Python
Testes e depuração de código com PythonTestes e depuração de código com Python
Testes e depuração de código com PythonDorneles Treméa
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalAdriano Petrich
 

Mais procurados (20)

Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
 
O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019
 
Poo1 aula 3 - java - comentários instruções e blocos-palavras chave
Poo1   aula 3 - java - comentários instruções e blocos-palavras chavePoo1   aula 3 - java - comentários instruções e blocos-palavras chave
Poo1 aula 3 - java - comentários instruções e blocos-palavras chave
 
10+ Coisas Que Odeio Em Php
10+ Coisas Que Odeio Em Php10+ Coisas Que Odeio Em Php
10+ Coisas Que Odeio Em Php
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Testes de integração em microservices
Testes de integração em microservicesTestes de integração em microservices
Testes de integração em microservices
 
Frameworks PHP
Frameworks PHPFrameworks PHP
Frameworks PHP
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.net
 
Testes e depuração de código com Python
Testes e depuração de código com PythonTestes e depuração de código com Python
Testes e depuração de código com Python
 
Aula10 -PHP
Aula10 -PHPAula10 -PHP
Aula10 -PHP
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
Cabra Macho
Cabra MachoCabra Macho
Cabra Macho
 
Aula12- PHP
Aula12- PHPAula12- PHP
Aula12- PHP
 
Pep8 pylint
Pep8 pylintPep8 pylint
Pep8 pylint
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao final
 
Pylint
PylintPylint
Pylint
 

Destaque

Testes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaTestes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaDouglas Matoso
 
Testando uma aplicação AngularJS utilizando o Karma
Testando uma aplicação AngularJS utilizando o KarmaTestando uma aplicação AngularJS utilizando o Karma
Testando uma aplicação AngularJS utilizando o KarmaHenrique Limas
 
Efficient JavaScript Unit Testing, JavaOne China 2013
Efficient JavaScript Unit Testing, JavaOne China 2013Efficient JavaScript Unit Testing, JavaOne China 2013
Efficient JavaScript Unit Testing, JavaOne China 2013Hazem Saleh
 
Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeJosh Mock
 
An Introduction to Unit Testing
An Introduction to Unit TestingAn Introduction to Unit Testing
An Introduction to Unit TestingJoe Tremblay
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingLars Thorup
 
Unit testing best practices
Unit testing best practicesUnit testing best practices
Unit testing best practicesnickokiss
 

Destaque (7)

Testes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaTestes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e Karma
 
Testando uma aplicação AngularJS utilizando o Karma
Testando uma aplicação AngularJS utilizando o KarmaTestando uma aplicação AngularJS utilizando o Karma
Testando uma aplicação AngularJS utilizando o Karma
 
Efficient JavaScript Unit Testing, JavaOne China 2013
Efficient JavaScript Unit Testing, JavaOne China 2013Efficient JavaScript Unit Testing, JavaOne China 2013
Efficient JavaScript Unit Testing, JavaOne China 2013
 
Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and Node
 
An Introduction to Unit Testing
An Introduction to Unit TestingAn Introduction to Unit Testing
An Introduction to Unit Testing
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit Testing
 
Unit testing best practices
Unit testing best practicesUnit testing best practices
Unit testing best practices
 

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

Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?Elaine Naomi
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes AutomatizadosSamanta Cicilia
 
Realizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosRealizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosVIVIANE RANGEL
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
Test driven development
Test driven developmentTest driven development
Test driven developmentclauvane1708
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 

Semelhante a Testes unitários como ferramentas de design de código (20)

Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?
 
Clean code
Clean codeClean code
Clean code
 
Clean Code
Clean CodeClean Code
Clean Code
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados
 
Realizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosRealizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitos
 
O programador pragmático
O programador pragmáticoO programador pragmático
O programador pragmático
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Clean Code
Clean CodeClean Code
Clean Code
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Mini aula de teste de software
Mini aula de teste de softwareMini aula de teste de software
Mini aula de teste de software
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 

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