SlideShare uma empresa Scribd logo
1 de 68
Testes
Versão Python
Osvaldo Santana Neto
osantana@triveos.com
Sunday, October 24, 2010
Osvaldo Santana Neto
Programador amador
desde 1988
Programador profissional
desde 1991
Programador Python
desde 2000
Programador Django
desde 2008
Sunday, October 24, 2010
Teste automatizado
... é o uso de software para controlar a
execução dos testes.
Sunday, October 24, 2010
Testes automatizados
Unitários
Integração
Funcionais
Aceitação
Regressão
Outros: performance, estático, performance,
segurança, ...
Sunday, October 24, 2010
Unitário
Inventory
Sunday, October 24, 2010
Unitário
Unitário
Inventory
Order
Integração
DB
Sunday, October 24, 2010
Funcionais
Unitário
Unitário
Inventory
Order
Integração
DB
Sunday, October 24, 2010
Testes automatizados
Prós
Asseguram uma
qualidade maior no
código
Garante que os
sistemas continuem
funcionando após
mudanças
Contras
Não garatem que o
código é "bug free"
Tempo de
desenvolvimento e
manutenção de
aplicação tem um
pequeno aumento
Sunday, October 24, 2010
Testes automatizados
No longo prazo sempre trazem benefícios
Quando usar?
para testar código que já existe
antes de iniciar uma refatoração
durante o processo de bugfix
antes de implementar o código (usado para guiar a
implementação) — Test-Driven Development
Sunday, October 24, 2010
Cobertura de código
Desejável 100%
Não existe ferramenta capaz de medir com 100% de
certeza a cobertura
Código 100% coberto != código sem bugs
Ferramenta: coverage.py
Sunday, October 24, 2010
Test-Driven Development
Desenvolvimento guiado por testes
Sunday, October 24, 2010
Test-Driven Development
Abreviação: TDD
Kent Beck: prática de
XP e depois em seu
livro Test-Driven
Development by
Examples
Utilização de testes
unitários na condução
do desenvolvimento
traduzido
Sunday, October 24, 2010
Test-Driven Development
TDD não é "ensinado".
TDD é "praticado"
Na fase de treinamento
é importante seguir as
regras. Depois
podemos quebrá-las.
Baby Steps
Sunday, October 24, 2010
Test-Driven Development
Uma linha de código só existe se tiver um teste a
avaliando
Altos índices de cobertura: >90%
Sunday, October 24, 2010
Red. Green. Refactor.
Escrever um
teste que falha
Fazer o
teste passar
Refatorar
Sunday, October 24, 2010
Red.
Escrever um teste que inevitavelmente falhe
Se o teste não falhar?
A nova funcionalidade já existe e,
consequentemente, já deve ter sido testada.
Mantê-lo é opcional mas se não tivermos
segurança para removê-lo é melhor mantê-lo.
Teste com problema
Sunday, October 24, 2010
Green.
Escrever o mínimo de código que faça o teste passar
"Fake It ('Til you make it)" — valores 'hard coded' ou
objetos "fakes" no lugar de dependências ainda não
implementadas
Triangulate — implementação real quando você tem
dois ou mais exemplos
"Obvious Implementation ('Til you get red bars)" —
implementações óbvias podem ser feitas
Sunday, October 24, 2010
Refactor.
Refatoração:
Aperfeiçoar o código
sem alterar o seu
comportamento
Remover duplicação
de código entre o
código implementado
e o teste
traduzido
Sunday, October 24, 2010
Testes unitários
Teste de uma unidade de código
Sunday, October 24, 2010
Testes unitários
Unidades de código: funções, métodos, classes, ...
System Under Test (SUT) — código que está sendo
testado
Framework xUnit: unittest, nose e py.test
Criado por Kent Beck para Smalltalk e
posteriormente para Java (jUnit)
Doctests — documentação "executável"
Sunday, October 24, 2010
Testes unitários
Ferramentas Python — http://j.mp/ptRk
Unit Test e Runners: unittest, doctest, nose, py.test, ...
Mockery: mocker, pyMock, pMock, Mock, mox, ...
Functional/Acceptance: selenium, windmill, pyccuracy,
twirl, django-client, ...
Static: pylint, pyflakes, pychecker, ...
Coverage: coverage
Sunday, October 24, 2010
Testes unitários
Usaremos:
Ambiente virtual isolado: virtualenv
Unit Test e Runners: unittest e nose
Mockery: mocker
Functional/Acceptance: selenium
Coverage: coverage
Sunday, October 24, 2010
Testes unitários
Existe a possibilidade de usar outras ferramentas para
os casos:
Unittest e Runners: py.test
Mockery: Mock
Neste caso os exemplos precisarão ser feitos "na mão"
Sunday, October 24, 2010
Testes unitários
Etapas:
Setup (setUp) — preapara o ambiente onde o teste
será executado (fixtures)
Exercise (test*) — executa o procedimento a ser
testado
Assert (assert*/verify) — verifica os resultados
Teardown (tearDown) — limpa o ambiente
Sunday, October 24, 2010
Testes unitários
Dicas
O melhor "primeiro teste" é o teste que verifica o
caso de uso mais comum. O teste mais básico.
Comece a escrever pelas "assertions"
Sunday, October 24, 2010
Testes unitários
Características
Isolamento — testes são independentes
Legibilidade — devem privilegiar legibilidade
Velocidade — devem executar rapidamente
Manutenabilidade — manutenção deve ser fácil
Não intrusivos — código de teste deve ficar somente
no teste e não no SUT
Sunday, October 24, 2010
Testes unitários
Isolamento
Um teste devem funcionar de forma independente
de outros testes e assumir um ambiente "limpo" para
execução
Todas as dependências do código testado devem
ser subtituídas por "doubles" (fakes/stubs ou mocks)
Mocks aren't Stubs - Martin Fowler
http://bit.ly/mockrnstubs
Sunday, October 24, 2010
Testes unitários
Legibilidade
O código do teste não precisa ser elegante, precisa
ser legível. Testes são para "consumo" humano
Resultados esperados em primeiro lugar:
Pior Melhor
banco = Banco()
banco.indice("USD", "BRL", TAXA_PADRAO)
banco.comissao(COMISSAO_PADRAO)
res = banco.converte(
Nota(100, "USD"), "BRL)
assert res == Nota(49.25, "BRL")
banco = Banco()
banco.indice("USD", "BRL", TAXA_PADRAO)
banco.comissao(COMISSAO_PADRAO)
res = banco.converte(
Nota(100, "USD"), "BRL)
assert Nota(49.25, "BRL") == res
Sunday, October 24, 2010
Testes unitários
Legibilidade
Dados evidentes: deixe a relação entre as entradas e
os resultados aparente:
Pior Melhor
banco = Banco()
banco.indice("USD", "BRL", TAXA_PADRAO)
banco.comissao(COMISSAO_PADRAO)
res = banco.converte(
Nota(100, "USD"), "BRL)
assert Nota(49.25, "BRL") == res
banco = Banco()
banco.indice("USD", "BRL", 2.00)
banco.comissao(0.015)
res = banco.converte(
Nota(100, "USD"), "BRL)
assert Nota(100 / 2 * (1 - 0.015), "BRL")
== res
Sunday, October 24, 2010
Testes unitários
Legibilidade
Nome de teste: test_(pass|fail)_descricao_(invalid|
with_x|without_y|basic)
Apenas 1 ciclo setup/exercise/verify/teardown por
teste
A legibilidade sempre é subjetiva mas é importante
estabelecer padrões em projetos desenvolvidos por
equipes com vários desenvolvedores
Sunday, October 24, 2010
Testes unitários
Dicas
O ciclo completo de red/green/refactor deve ser
curto para privilegiar o ritmo.
Se o teste está ficando grande: quebre-o em testes
menores
Sunday, October 24, 2010
Testes unitários
Dicas
Programando sozinho? Deixe o último teste
"quebrado" no fim de uma sessão de programação
para saber de onde retomar o desenvolvimento
Programando em equipe? Faça 'commit' somente
se todos os testes estiverem passando
Usa um sistema de controle de versão distribuído?
Deixe 'quebrado' localmente
Sunday, October 24, 2010
Testes unitários
Testabilidade
Fácil testar: código bem desenhado, código criado
com TDD, funções determinísticas, etc
Difícil testar: GUI, código assíncrono, esquemas em
banco de dados, componentes de aplicações
distribuídas, funções não-determinísticas, etc
Existem práticas e padrões que tornam alguns
tipos de testes mais fáceis de serem feitos
Sunday, October 24, 2010
Padrões com objetos falsos
Test Double Patterns
Sunday, October 24, 2010
Exemplo de código
Sunday, October 24, 2010
Exemplo de código
Dependência
Sunday, October 24, 2010
Testes falham
Sunday, October 24, 2010
Testes falham
FALHAM!
Sunday, October 24, 2010
Test Double
Substituir uma ou mais dependências do SUT por um
equivalente específico para o teste:
Test Double
Dummy
Object
Test
Stub
Test Spy
Mock
Object
Fake
Object
Sunday, October 24, 2010
Dummy
Geralmente são valores que não são usados no teste.
Algumas vezes são apenas passados como
parâmetros para atender ao número de parâmetros de
um método.
Sunday, October 24, 2010
Fake
Uma implementação funcional do objeto original
Sunday, October 24, 2010
Stubs
Similares aos objetos Fake
Não tem uma implementação funcional, apenas
retorna valores pré-estabelecidos
Podem gerar uma exceção para testar comportamento
do SUT nessa situação
Ex: Simular um erro de timeout na conexão com um
banco de dados
Sunday, October 24, 2010
Spy
Similares aos objetos Stub
Registram chamadas para seus métodos para que seja
possível fazer uma verificação indireta posteriormente
Ex. Servidor de e-mail que registra e-mails "enviados"
Sunday, October 24, 2010
Mock
Tipo especial de objeto que pode ser programado com
as expectativas de chamadas e retornos
Sunday, October 24, 2010
Mock
Rede de objetos
Fonte: Growing Object-Oriented Software, Guided by Tests
Sunday, October 24, 2010
Mock
Testando objeto
isoladamente
Fonte: Growing Object-Oriented Software, Guided by Tests
Sunday, October 24, 2010
Mock
Testando com um
objeto mock
Fonte: Growing Object-Oriented Software, Guided by Tests
Sunday, October 24, 2010
Mock
Testando com um
objeto mock
Fonte: Growing Object-Oriented Software, Guided by Tests
Sunday, October 24, 2010
Mocker
http://labix.org/mocker
Desenvolvida pelo brasileiro Gustavo Niemeyer
Usa a estratégia Record (para especificar as
expectativas e retornos) & Play (para verificar os
resultados)
Sunday, October 24, 2010
Mock
Mocker
Sunday, October 24, 2010
Padrões para banco de
dados
Database Patterns
Sunday, October 24, 2010
Padrões de banco de dados
Database Sandbox — cada desenvolvedor tem um
banco de dados à sua disposição (ex. Django SQLite in
memory)
Table Truncate Teardown — truncar as tabelas na fase
do teardown
Transaction Rollback Teardown — iniciar uma
transação na fase de setup e efetuar um rollback na
fase de teardown. Deve-se cuidar para que não tenha
nenhum commit no SUT
Sunday, October 24, 2010
Padrões de desenho para
testabilidade
Design-for-Testability Patterns
Sunday, October 24, 2010
Padrões para testabilidade
Dependency Injection — permite substituir
dependências do SUT por Test Doubles.
A dependência pode ser passada na construção ou
como parâmetro do método.
Ex. O objeto TimeDisplay depende de TimeProvider
que, nos testes, é substituído por stub/mock
Dependency Lookup — o objeto busca suas
dependências em um local específico. Ex. registro, dict
Sunday, October 24, 2010
Padrões para testabilidade
Humble object — extrair a lógica num componente
separado e mais fácil de testar.
Ex. extrair a parte síncrona de um objeto com
operações assíncronas
Pode-se usar um método no lugar de um objeto
Test Hook — não use: adicionar lógica condicional no
SUT para se comportar de modo específico com os
testes
Exemplo!
pag. 764 do xunit
Sunday, October 24, 2010
Desenvolvendo aplicações
Desenvolvendo aplicações completas usando
Test-Driven Development
Sunday, October 24, 2010
Desenvolvendo aplicações
Testes de aceitação
Validar requisitos dos
clientes
Selenium2,
Pyccuracy, Windmill,
Django Client, etc.
Inicia ciclo red/green/
refactor
Sunday, October 24, 2010
Desenvolvendo aplicações
Escrever um
teste que falha
Fazer o
teste passar
Refatorar
Escrever um
teste de aceitação
que falha
Sunday, October 24, 2010
Desenvolvendo aplicações
Escrever um
teste que falha
Fazer o
teste passar
Refatorar
Escrever um
teste de aceitação
que falha
Se surgir alguma idéia
nova para outro teste:
anote no papel
Sunday, October 24, 2010
Resumo
Sumário dos tópicos abordados
Sunday, October 24, 2010
Resumo
Testes são isolados
A ordem dos testes não é garantida
Não se deve adicionar lógica de teste no código de
produção
Testes devem assumir um ambiente limpo quando
começam e limpar o ambiente quando terminam
Sunday, October 24, 2010
Resumo
red / green / refactor
setup, exercise, verify, teardown
Sunday, October 24, 2010
F.A.Q.
Quando sei que os testes são suficientes?
Quando você tiver certeza que seu software está
completo e sem bugs: nunca serão.
Quando eu preciso fazer testes:
Resposta curta: sempre. Resposta longa: quando
você não tiver segurança total daquilo que precisa
ser feito
Sunday, October 24, 2010
F.A.Q.
Qual o tamanho ideal de um baby-step?
Resposta curta: do tamanho que te dê segurança.
Resposta longa: TDD é uma prática e como tal
requer treino. O ideal é que no início se use passos
pequenos e posteriormente aumentá-los.
Existe uma relação direta entre a cobertura de testes e
a quantidade de bugs num código?
Existe essa relação mas ela não é linear.
Sunday, October 24, 2010
Mensagens
Teste é algo desejável num software. Melhor se forem
automatizados e ótimos se o código foi feito depois do
teste
Falácia: "Código não testado é código bugado"
Não existe bala de prata, logo, teste automatizado
não é uma delas
Atenção para os "radicais do teste". Radicalismo
nunca é bom para um programador
Sunday, October 24, 2010
Leitura complementar
Não terminamos por aqui...
Sunday, October 24, 2010
Leitura Complementar
Internet
TDD @ Wikipedia — http://j.mp/zBGgt
Mocks aren't Stubs — http://j.mp/7MdzF
Inversion of Control and Dependency Injection —
http://j.mp/I0YAA
Sunday, October 24, 2010
Leitura Complementar
Sunday, October 24, 2010

Mais conteúdo relacionado

Mais procurados

Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a ObjetosIgor Takenami
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de SoftwareCapgemini
 
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)Leinylson Fontinele
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosFábio dos Reis
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Daniel Brandão
 
Apresentacao Testes de Unidade
Apresentacao Testes de UnidadeApresentacao Testes de Unidade
Apresentacao Testes de UnidadeAline Ferreira
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a pooSedu
 
Arquitetura de Software Visão Geral
Arquitetura de Software Visão GeralArquitetura de Software Visão Geral
Arquitetura de Software Visão Geralsergiocrespo
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Adriano Teixeira de Souza
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em PythonRober Guerra
 
Estrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaEstrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaDaniel Arndt Alves
 
Modelo plano de_testes
Modelo plano de_testesModelo plano de_testes
Modelo plano de_testesIsaias Silva
 

Mais procurados (20)

Aula 09 - introducao oo
Aula 09 - introducao ooAula 09 - introducao oo
Aula 09 - introducao oo
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de Software
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)
Banco de Dados I - Aula 05 - Banco de Dados Relacional (Modelo Conceitual)
 
Aula 6 - Cardinalidade
Aula 6 - CardinalidadeAula 6 - Cardinalidade
Aula 6 - Cardinalidade
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentos
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)
 
Apresentacao Testes de Unidade
Apresentacao Testes de UnidadeApresentacao Testes de Unidade
Apresentacao Testes de Unidade
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a poo
 
Arquitetura de Software Visão Geral
Arquitetura de Software Visão GeralArquitetura de Software Visão Geral
Arquitetura de Software Visão Geral
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Clean Code
Clean CodeClean Code
Clean Code
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
 
Estrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaEstrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da Disciplina
 
Modelo plano de_testes
Modelo plano de_testesModelo plano de_testes
Modelo plano de_testes
 

Semelhante a Testes automatizados Python

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesCamilo Ribeiro
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidEduardo Carrara de Araujo
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyseDouglas Bastos
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netRenato Groff
 
ybr789try
ybr789tryybr789try
ybr789tryteste
 
Testes de software
Testes de softwareTestes de software
Testes de softwareteste
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliverySamanta Cicilia
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDRaphael Pacheco
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 

Semelhante a Testes automatizados Python (20)

TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps Android
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps Android
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyse
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.net
 
TDD Primeiro Contato
TDD Primeiro ContatoTDD Primeiro Contato
TDD Primeiro Contato
 
ybr789try
ybr789tryybr789try
ybr789try
 
Testes de software
Testes de softwareTestes de software
Testes de software
 
Testes de Software.ppt
Testes de Software.pptTestes de Software.ppt
Testes de Software.ppt
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
CNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous DeliveryCNQS - Testes Automatizados & Continuous Delivery
CNQS - Testes Automatizados & Continuous Delivery
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 

Mais de Osvaldo Santana Neto

Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonOsvaldo Santana Neto
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Osvaldo Santana Neto
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Osvaldo Santana Neto
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remotoOsvaldo Santana Neto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaOsvaldo Santana Neto
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Osvaldo Santana Neto
 
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
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Osvaldo Santana Neto
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaOsvaldo Santana Neto
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Osvaldo Santana Neto
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Osvaldo Santana Neto
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasOsvaldo Santana Neto
 
Desenvolvimento RAD com Python (Fenasoft)
Desenvolvimento RAD com Python (Fenasoft)Desenvolvimento RAD com Python (Fenasoft)
Desenvolvimento RAD com Python (Fenasoft)Osvaldo Santana Neto
 

Mais de Osvaldo Santana Neto (20)

Basic Brainf*ck
Basic Brainf*ckBasic Brainf*ck
Basic Brainf*ck
 
Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com Python
 
A Web é uma API
A Web é uma APIA Web é uma API
A Web é uma API
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)
 
Olist Architecture v2.0
Olist Architecture v2.0Olist Architecture v2.0
Olist Architecture v2.0
 
Advanced Brainf*ck
Advanced Brainf*ckAdvanced Brainf*ck
Advanced Brainf*ck
 
Corrigindo Bugs no CPython
Corrigindo Bugs no CPythonCorrigindo Bugs no CPython
Corrigindo Bugs no CPython
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remoto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funciona
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20
 
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
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonista
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horas
 
Programação RAD com Python
Programação RAD com PythonProgramação RAD com Python
Programação RAD com Python
 
Desenvolvimento RAD com Python (Fenasoft)
Desenvolvimento RAD com Python (Fenasoft)Desenvolvimento RAD com Python (Fenasoft)
Desenvolvimento RAD com Python (Fenasoft)
 

Testes automatizados Python

  • 1. Testes Versão Python Osvaldo Santana Neto osantana@triveos.com Sunday, October 24, 2010
  • 2. Osvaldo Santana Neto Programador amador desde 1988 Programador profissional desde 1991 Programador Python desde 2000 Programador Django desde 2008 Sunday, October 24, 2010
  • 3. Teste automatizado ... é o uso de software para controlar a execução dos testes. Sunday, October 24, 2010
  • 4. Testes automatizados Unitários Integração Funcionais Aceitação Regressão Outros: performance, estático, performance, segurança, ... Sunday, October 24, 2010
  • 8. Testes automatizados Prós Asseguram uma qualidade maior no código Garante que os sistemas continuem funcionando após mudanças Contras Não garatem que o código é "bug free" Tempo de desenvolvimento e manutenção de aplicação tem um pequeno aumento Sunday, October 24, 2010
  • 9. Testes automatizados No longo prazo sempre trazem benefícios Quando usar? para testar código que já existe antes de iniciar uma refatoração durante o processo de bugfix antes de implementar o código (usado para guiar a implementação) — Test-Driven Development Sunday, October 24, 2010
  • 10. Cobertura de código Desejável 100% Não existe ferramenta capaz de medir com 100% de certeza a cobertura Código 100% coberto != código sem bugs Ferramenta: coverage.py Sunday, October 24, 2010
  • 11. Test-Driven Development Desenvolvimento guiado por testes Sunday, October 24, 2010
  • 12. Test-Driven Development Abreviação: TDD Kent Beck: prática de XP e depois em seu livro Test-Driven Development by Examples Utilização de testes unitários na condução do desenvolvimento traduzido Sunday, October 24, 2010
  • 13. Test-Driven Development TDD não é "ensinado". TDD é "praticado" Na fase de treinamento é importante seguir as regras. Depois podemos quebrá-las. Baby Steps Sunday, October 24, 2010
  • 14. Test-Driven Development Uma linha de código só existe se tiver um teste a avaliando Altos índices de cobertura: >90% Sunday, October 24, 2010
  • 15. Red. Green. Refactor. Escrever um teste que falha Fazer o teste passar Refatorar Sunday, October 24, 2010
  • 16. Red. Escrever um teste que inevitavelmente falhe Se o teste não falhar? A nova funcionalidade já existe e, consequentemente, já deve ter sido testada. Mantê-lo é opcional mas se não tivermos segurança para removê-lo é melhor mantê-lo. Teste com problema Sunday, October 24, 2010
  • 17. Green. Escrever o mínimo de código que faça o teste passar "Fake It ('Til you make it)" — valores 'hard coded' ou objetos "fakes" no lugar de dependências ainda não implementadas Triangulate — implementação real quando você tem dois ou mais exemplos "Obvious Implementation ('Til you get red bars)" — implementações óbvias podem ser feitas Sunday, October 24, 2010
  • 18. Refactor. Refatoração: Aperfeiçoar o código sem alterar o seu comportamento Remover duplicação de código entre o código implementado e o teste traduzido Sunday, October 24, 2010
  • 19. Testes unitários Teste de uma unidade de código Sunday, October 24, 2010
  • 20. Testes unitários Unidades de código: funções, métodos, classes, ... System Under Test (SUT) — código que está sendo testado Framework xUnit: unittest, nose e py.test Criado por Kent Beck para Smalltalk e posteriormente para Java (jUnit) Doctests — documentação "executável" Sunday, October 24, 2010
  • 21. Testes unitários Ferramentas Python — http://j.mp/ptRk Unit Test e Runners: unittest, doctest, nose, py.test, ... Mockery: mocker, pyMock, pMock, Mock, mox, ... Functional/Acceptance: selenium, windmill, pyccuracy, twirl, django-client, ... Static: pylint, pyflakes, pychecker, ... Coverage: coverage Sunday, October 24, 2010
  • 22. Testes unitários Usaremos: Ambiente virtual isolado: virtualenv Unit Test e Runners: unittest e nose Mockery: mocker Functional/Acceptance: selenium Coverage: coverage Sunday, October 24, 2010
  • 23. Testes unitários Existe a possibilidade de usar outras ferramentas para os casos: Unittest e Runners: py.test Mockery: Mock Neste caso os exemplos precisarão ser feitos "na mão" Sunday, October 24, 2010
  • 24. Testes unitários Etapas: Setup (setUp) — preapara o ambiente onde o teste será executado (fixtures) Exercise (test*) — executa o procedimento a ser testado Assert (assert*/verify) — verifica os resultados Teardown (tearDown) — limpa o ambiente Sunday, October 24, 2010
  • 25. Testes unitários Dicas O melhor "primeiro teste" é o teste que verifica o caso de uso mais comum. O teste mais básico. Comece a escrever pelas "assertions" Sunday, October 24, 2010
  • 26. Testes unitários Características Isolamento — testes são independentes Legibilidade — devem privilegiar legibilidade Velocidade — devem executar rapidamente Manutenabilidade — manutenção deve ser fácil Não intrusivos — código de teste deve ficar somente no teste e não no SUT Sunday, October 24, 2010
  • 27. Testes unitários Isolamento Um teste devem funcionar de forma independente de outros testes e assumir um ambiente "limpo" para execução Todas as dependências do código testado devem ser subtituídas por "doubles" (fakes/stubs ou mocks) Mocks aren't Stubs - Martin Fowler http://bit.ly/mockrnstubs Sunday, October 24, 2010
  • 28. Testes unitários Legibilidade O código do teste não precisa ser elegante, precisa ser legível. Testes são para "consumo" humano Resultados esperados em primeiro lugar: Pior Melhor banco = Banco() banco.indice("USD", "BRL", TAXA_PADRAO) banco.comissao(COMISSAO_PADRAO) res = banco.converte( Nota(100, "USD"), "BRL) assert res == Nota(49.25, "BRL") banco = Banco() banco.indice("USD", "BRL", TAXA_PADRAO) banco.comissao(COMISSAO_PADRAO) res = banco.converte( Nota(100, "USD"), "BRL) assert Nota(49.25, "BRL") == res Sunday, October 24, 2010
  • 29. Testes unitários Legibilidade Dados evidentes: deixe a relação entre as entradas e os resultados aparente: Pior Melhor banco = Banco() banco.indice("USD", "BRL", TAXA_PADRAO) banco.comissao(COMISSAO_PADRAO) res = banco.converte( Nota(100, "USD"), "BRL) assert Nota(49.25, "BRL") == res banco = Banco() banco.indice("USD", "BRL", 2.00) banco.comissao(0.015) res = banco.converte( Nota(100, "USD"), "BRL) assert Nota(100 / 2 * (1 - 0.015), "BRL") == res Sunday, October 24, 2010
  • 30. Testes unitários Legibilidade Nome de teste: test_(pass|fail)_descricao_(invalid| with_x|without_y|basic) Apenas 1 ciclo setup/exercise/verify/teardown por teste A legibilidade sempre é subjetiva mas é importante estabelecer padrões em projetos desenvolvidos por equipes com vários desenvolvedores Sunday, October 24, 2010
  • 31. Testes unitários Dicas O ciclo completo de red/green/refactor deve ser curto para privilegiar o ritmo. Se o teste está ficando grande: quebre-o em testes menores Sunday, October 24, 2010
  • 32. Testes unitários Dicas Programando sozinho? Deixe o último teste "quebrado" no fim de uma sessão de programação para saber de onde retomar o desenvolvimento Programando em equipe? Faça 'commit' somente se todos os testes estiverem passando Usa um sistema de controle de versão distribuído? Deixe 'quebrado' localmente Sunday, October 24, 2010
  • 33. Testes unitários Testabilidade Fácil testar: código bem desenhado, código criado com TDD, funções determinísticas, etc Difícil testar: GUI, código assíncrono, esquemas em banco de dados, componentes de aplicações distribuídas, funções não-determinísticas, etc Existem práticas e padrões que tornam alguns tipos de testes mais fáceis de serem feitos Sunday, October 24, 2010
  • 34. Padrões com objetos falsos Test Double Patterns Sunday, October 24, 2010
  • 35. Exemplo de código Sunday, October 24, 2010
  • 39. Test Double Substituir uma ou mais dependências do SUT por um equivalente específico para o teste: Test Double Dummy Object Test Stub Test Spy Mock Object Fake Object Sunday, October 24, 2010
  • 40. Dummy Geralmente são valores que não são usados no teste. Algumas vezes são apenas passados como parâmetros para atender ao número de parâmetros de um método. Sunday, October 24, 2010
  • 41. Fake Uma implementação funcional do objeto original Sunday, October 24, 2010
  • 42. Stubs Similares aos objetos Fake Não tem uma implementação funcional, apenas retorna valores pré-estabelecidos Podem gerar uma exceção para testar comportamento do SUT nessa situação Ex: Simular um erro de timeout na conexão com um banco de dados Sunday, October 24, 2010
  • 43. Spy Similares aos objetos Stub Registram chamadas para seus métodos para que seja possível fazer uma verificação indireta posteriormente Ex. Servidor de e-mail que registra e-mails "enviados" Sunday, October 24, 2010
  • 44. Mock Tipo especial de objeto que pode ser programado com as expectativas de chamadas e retornos Sunday, October 24, 2010
  • 45. Mock Rede de objetos Fonte: Growing Object-Oriented Software, Guided by Tests Sunday, October 24, 2010
  • 46. Mock Testando objeto isoladamente Fonte: Growing Object-Oriented Software, Guided by Tests Sunday, October 24, 2010
  • 47. Mock Testando com um objeto mock Fonte: Growing Object-Oriented Software, Guided by Tests Sunday, October 24, 2010
  • 48. Mock Testando com um objeto mock Fonte: Growing Object-Oriented Software, Guided by Tests Sunday, October 24, 2010
  • 49. Mocker http://labix.org/mocker Desenvolvida pelo brasileiro Gustavo Niemeyer Usa a estratégia Record (para especificar as expectativas e retornos) & Play (para verificar os resultados) Sunday, October 24, 2010
  • 51. Padrões para banco de dados Database Patterns Sunday, October 24, 2010
  • 52. Padrões de banco de dados Database Sandbox — cada desenvolvedor tem um banco de dados à sua disposição (ex. Django SQLite in memory) Table Truncate Teardown — truncar as tabelas na fase do teardown Transaction Rollback Teardown — iniciar uma transação na fase de setup e efetuar um rollback na fase de teardown. Deve-se cuidar para que não tenha nenhum commit no SUT Sunday, October 24, 2010
  • 53. Padrões de desenho para testabilidade Design-for-Testability Patterns Sunday, October 24, 2010
  • 54. Padrões para testabilidade Dependency Injection — permite substituir dependências do SUT por Test Doubles. A dependência pode ser passada na construção ou como parâmetro do método. Ex. O objeto TimeDisplay depende de TimeProvider que, nos testes, é substituído por stub/mock Dependency Lookup — o objeto busca suas dependências em um local específico. Ex. registro, dict Sunday, October 24, 2010
  • 55. Padrões para testabilidade Humble object — extrair a lógica num componente separado e mais fácil de testar. Ex. extrair a parte síncrona de um objeto com operações assíncronas Pode-se usar um método no lugar de um objeto Test Hook — não use: adicionar lógica condicional no SUT para se comportar de modo específico com os testes Exemplo! pag. 764 do xunit Sunday, October 24, 2010
  • 56. Desenvolvendo aplicações Desenvolvendo aplicações completas usando Test-Driven Development Sunday, October 24, 2010
  • 57. Desenvolvendo aplicações Testes de aceitação Validar requisitos dos clientes Selenium2, Pyccuracy, Windmill, Django Client, etc. Inicia ciclo red/green/ refactor Sunday, October 24, 2010
  • 58. Desenvolvendo aplicações Escrever um teste que falha Fazer o teste passar Refatorar Escrever um teste de aceitação que falha Sunday, October 24, 2010
  • 59. Desenvolvendo aplicações Escrever um teste que falha Fazer o teste passar Refatorar Escrever um teste de aceitação que falha Se surgir alguma idéia nova para outro teste: anote no papel Sunday, October 24, 2010
  • 60. Resumo Sumário dos tópicos abordados Sunday, October 24, 2010
  • 61. Resumo Testes são isolados A ordem dos testes não é garantida Não se deve adicionar lógica de teste no código de produção Testes devem assumir um ambiente limpo quando começam e limpar o ambiente quando terminam Sunday, October 24, 2010
  • 62. Resumo red / green / refactor setup, exercise, verify, teardown Sunday, October 24, 2010
  • 63. F.A.Q. Quando sei que os testes são suficientes? Quando você tiver certeza que seu software está completo e sem bugs: nunca serão. Quando eu preciso fazer testes: Resposta curta: sempre. Resposta longa: quando você não tiver segurança total daquilo que precisa ser feito Sunday, October 24, 2010
  • 64. F.A.Q. Qual o tamanho ideal de um baby-step? Resposta curta: do tamanho que te dê segurança. Resposta longa: TDD é uma prática e como tal requer treino. O ideal é que no início se use passos pequenos e posteriormente aumentá-los. Existe uma relação direta entre a cobertura de testes e a quantidade de bugs num código? Existe essa relação mas ela não é linear. Sunday, October 24, 2010
  • 65. Mensagens Teste é algo desejável num software. Melhor se forem automatizados e ótimos se o código foi feito depois do teste Falácia: "Código não testado é código bugado" Não existe bala de prata, logo, teste automatizado não é uma delas Atenção para os "radicais do teste". Radicalismo nunca é bom para um programador Sunday, October 24, 2010
  • 66. Leitura complementar Não terminamos por aqui... Sunday, October 24, 2010
  • 67. Leitura Complementar Internet TDD @ Wikipedia — http://j.mp/zBGgt Mocks aren't Stubs — http://j.mp/7MdzF Inversion of Control and Dependency Injection — http://j.mp/I0YAA Sunday, October 24, 2010