2. O Palestrante
✦ Tecnólogo em Computação especialista em Sistemas Web e
Interface
✦ Atua na área de desenvolvimento e implementação de projetos de
Software Web
✦ Desenvolvedor Mobile
✦ Desenvolvedor PHP desde 1999 e membro ativo desde 2001
✦ Desenvolvedor WordPress
✦ Membro ativo das comunidades de SL: PHP-SP, PHP-SC, ZF-BR,
KDE-BR, OpenSUSE-BR, AMAROK-DE e WP-DEVEL
✦ Trocou São Paulo por Floripa para desenvolver seu trabalho na
Primesoft Sistemas
✦ Na rede: http://about.me/mingomax
3. A Audiência
✓ Estudantes?
✓ Curiosos / Entusiastas?
✓ Desenvolvedores PHP?
✓ Desenvolvedores de outras linguagens?
✓ Todas as opções acima!
✓ Nenhuma da Opções acima!
6. • Errar é inerente a natureza humana.
Precaver-se contra os erros é uma atitude
inteligente.
• O processo de desenvolvimento de software
é sujeito a erros. Sendo assim, a atividade de
teste é fundamental para se obter produtos
de software com garantia de qualidade.
• Discordar ou ignorar a frase acima revela
grande amadorismo.
7. Qualidade de Software
“Totalidade de características de uma entidade que lhe confere
a capacidade de satisfazer as necessidades explícitas e
implícitas.”
8. • Conformidade a:
• Requisitos funcionais e de desempenho;
• Padrões e convenções de
desenvolvimento preestabelecidos;
• Atributos implícitos que todo software
desenvolvido profissionalmente deve
possuir.
9. Como garantir a
qualidade de software?
• Aplicação de métodos e ferramentas
técnicas;
• Realização de revisões técnicas e inspeções;
• Atividades de testes;
• Aplicação de padrões;
10. Por quê surgem as
falhas?
• Alterações;
• Tempo;
• Complexidade;
13. • “Simulação”
• Facilidade de testar funções sem precisar preencher
formulários, criar usuários
• Tudo fica centralizado no teste e é feito apenas uma vez
• “Certeza”
• Testes podem simular todas situações possíveis e
garantir que seu código funciona como esperado
• “Garantia”
• Com um sistema coberto de testes você tem certeza
que sua alteração não vai quebrar outra área do sistema
15. • Tempo
• Embora você gaste mais tempo criando
testes, você ganha tempo durante as
simulações e na manutenção
• Gerência
• Convencer os responsáveis pelo projeto de
que testes irão trazer lucro é geralmente
complicado
17. “ O teste consiste em executar o
programa com a intenção de
encontrar erros”. (Myers, 1979)
18. • Principais objetivos dos testes:
• Foco na prevenção de erros;
• Descobrir sintomas causados por
erros;
• Fornecer diagnósticos claros para
que os erros sejam facilmente
corrigidos;
20. Objetivo do teste: mostrar que o software tem
erros.
Objetivos da depuração: encontrar a causa do
erro detectado no teste, e projetar e implementar as
modificações no programa para correção do erro
26. • TDD é uma técnica de desenvolvimento de software
cujo processo é formado por pequenas iterações para o
desenvolvimento de uma nova funcionalidade,
começando pela implementação de um caso de teste,
depois pelo código necessário para fazer o teste passar,
e finalmente pela refatoração do código visando melhor
acomodar as mudanças feitas.
• Não é um método para testar software, mas para
construir software.
• TDD vem do conceito de “test-first programming” do XP
(Extreme Programming), mas acabou ganhando tanto
interesse, que hoje tem sido adotado independente do
XP e das técnicas de programação ágil;
28. • Escrever testes antes da implementação:
• Faz você pensar no comportamento
• Reduz código especulativo
• Documenta
29. • Escreva somente código suficiente para o
teste passar e nada além disso
• Escreva testes pequenos: teste a menor
quantidade possível de código de cada vez
• Escreva testes muito rápidos: não devem
demorar mais do que alguns segundos para
serem executados
31. • Adição de novas funcionalidades em
pequenos passos
• O conceito chave de TDD é ter um
feedback rápido das mudanças no código
32. • A Metodologia TDD é conduzida através
dos “testes do programador”.
• Frequentemente esses testes são chamados
de “teste de unidade”, mas esse nem
sempre é o caso (pode ser teste de
integração).
• É importante destacar que não se trata dos
testes de sistema (caixa preta) nem os de
aceitação (feitos pelo usuário final)
36. • Testam apenas um componente do sistema
• Todos os outros componentes são
simulados (mock objects)
• Ferramenta: PHPUnit
• Fundamental para a prática do
TDD!
38. • Testam a integração entre componentes
• Envolvem dois ou mais componentes
(classes+SGBD, classes+SGBD+Fast, etc.)
• Ferramenta: PHPUnit, DBUnit, HSQLDB, Fit
• Normalmente não utilizado em TDD
40. • Testam uma história, funcionalidade ou caso
de uso
• Envolvem vários componentes do sistema
• Ferramenta
: PHPUnit, Selenium
• Pode ser utilizado em TDD
42. Atitude!
• Testar é uma atividade destrutiva!
• Pense de forma negativa quando estiver
criando planos de teste ou explorando o
software!
• Explore funcionalidades, pense no que não
foi pensado!
43. Princípios
• São independentes:
• Do código já testado;
• Da ordem de execução;
• Do ambiente;
• Devem ser:
• Fáceis de escrever;
• Fáceis de executar;
• Fáceis de compreender;
• Desenvolvidos paralelamente ao código;
44. PHPUnit
• Escrito por Sebastian
Bergmann
• Baseado nos conceitos
do JUnit
• Atualmente na versão
3.6.12
• Requer PHP 5
46. Anatomia
• Toda classe deve ter seu par para Teste:
• nomeClasse.php
• <nomeClasse>Test.php
• Escrever o caso de teste, usando o pós-fixo “Test”
• A classe tem um metodo algumaCoisa()
• Deve-se criar um metodo testAlgumaCoisa()
50. Isolamento
• Mantenha seus testes isolados
• Nunca rode testes no servidor de produção!
• Soluções
• Crie uma base separada
• Use pastas separadas para arquivos
• Sempre destrua tudo que seu teste
construiu
55. As vezes os testes
precisam de dublês
• Dummy
• Fake
• Stub
• Spy
• Mock
56. • Gera resultados não determinísticos (hora, temperatura
atual...);
• Tem estados que são difíceis de criar ou reproduzir
(erro de
comunicação da rede);
• É lento (um banco de dados completo que precisa ser
inicializado antes do teste);
• Ainda não existe ou pode ter comportamento alterado;
• Teriam que adicionar informações e métodos
exclusivamente para os testes (e não para sua função
real).
58. • Colabora para o aumento da qualidade dos
sistemas
• Desenvolvedores ficam mais corajosos e
confiantes ao programar!
• Software cresce de forma ordenada e com
qualidade de design
• Software se adapta com mais facilidade a
mudanças
59. • Demora mais?
• No início é necessário escrever muitos testes
• Depois da inércia a suite de regressão está pronta e
escrevem-se menos testes
• Certeza de que a implementação está funcionando
• Maioria dos bugs encontrados em tempo de
desenvolvimento
• Bugs de produção são encontrados e corrigidos com muito
mais velocidade
• Então no fim das contas demora-se muito menos tempo e com
muito mais qualidade!