SlideShare ist ein Scribd-Unternehmen logo
1 von 55
Downloaden Sie, um offline zu lesen
Testes de unidade
      avançados e TDD
     Luís Otávio Cobucci Oblonczyk



21 de Outubro de 2011
       6° SoLiSC
Luís Otávio Cobucci Oblonczyk
●
    Desenvolvedor PHP na Softnex Tecnologia
●
    Orientador no Senac TI
●
    Doido por PHP desde 2003
●
    Perfeccionista ao extremo =P



    @lcobucci
    http://about.me/lcobucci
Normalmente quando desenvolvemos fazemos o teste F5
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
                                        4) F5
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
                                        4) F5
                                        5) Muda o código
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
                                        4) F5
                                        5) Muda o código
                                        6) F5
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
                                        4) F5
                                        5) Muda o código
                                        6) F5
                                        …
Normalmente quando desenvolvemos fazemos o teste F5



                                        1) Abre sistema no
                                       browser
                                        2) Procura o erro
                                        3) Muda o código
                                        4) F5
                                        5) Muda o código
                                        6) F5
                                        …
                                        999) Resolve o
                                       problema
Quanto tempo PERDEMOS nesta brincadeira?
Quanto dinheiro PERDEMOS nesta brincadeira?
E a pergunta que não quer calar...
Quando isso acontece num ambiente “separado”
não tem GRANDES problemas
E quando acontece na “vida real”?
Tá, e o que eu posso fazer?
Tá, e o que eu posso fazer?




    Automatizar alguns testes!
                     (pra começar)
Testes de Unidade
 “Teste de unidade é toda a aplicação de teste
 nas assinaturas de entradas e saídas de um
 sistema, consiste em validar dados válidos e
 inválidos via I/O (entrada/saída) sendo aplicado
 por desenvolvedores ou analistas de teste.
 Uma unidade é a menor parte testável de um
 programa de computador.”


 http://pt.wikipedia.org/wiki/Teste_de_unidade
Testes de Unidade
●
    Te dá uma visão rápida do teu código: ou
    funciona ou não funciona
●
    Facilita o desenvolvimento, pois caso alguma
    alteração estrague uma funcionalidade já
    existente, você fica sabendo antes mesmo de
    ser enviado para os sistemas de controle de
    versão
●
    Servem também como parte da documentação
●
    Ajuda a manter a sanidade mental da equipe
Utilizarei aqui funcionalidades
presentes a partir do PHP 5.3.2!
Utilizarei aqui funcionalidades
presentes a partir do PHP 5.3.2!




                                   Se você ainda não usa
                                   o PHP 5.3 é uma boa
                                   oportunidade de
                                   começar ; )
PHPUnit
 O que é: Framework p/ criação e execução de
 testes de unidade. Faz parte da família xUnit.
 Criador: Sebastian Bergmann
 Instalação:
   pear config-set auto_discover 1
   pear install pear.phpunit.de/PHPUnit


 http://www.phpunit.de
Bora pro código!
src/Lcobucci/Examples/Tests/Calculator.php
<?php
namespace LcobucciExamplesTests;

class Calculator
{
    public function sum($number1, $number2)
    {
        return $number1 + $number2;
    }
}
test/Lcobucci/Examples/Tests/CalculatorTest.php
<?php
require_once 'src/Lcobucci/Examples/Tests/Calculator.php';
require_once 'PHPUnit/Framework/TestCase.php';

use LcobucciExamplesTestsCalculator;

class CalculatorTest extends PHPUnit_Framework_TestCase
{
    public function testSum()
    {
        $calculator = new Calculator();
        $this->assertEquals(4, $calculator->sum(2, 2));
    }
}
TestCase e TestSuite
●
    O TestCase possui métodos de testes para um
    recurso (normalmente uma classe)
●
    TestSuites formam grupos de testes, ou seja
    dentro de um TestSuite podem ter vários
    TestCases ou até vários TestSuites
tearDown() e setUp()
●
    São métodos protegidos (com visibilidade
    protected) disponíveis tanto no TestCase
    quanto no TestSuite
●
    Podem ser sobrecarregados caso NECESSÁRIO,
    e são utilizados para preparar e limpar o
    ambiente de teste
●
    No TestCase o setUp() é executado ANTES de
    cada método de teste e o tearDown ao FINAL
    de cada método
tearDown() e setUp()
●
    No TestSuite o setUp() é executado ANTES de
    cada item da suite de testes e o tearDown ao
    FINAL de cada item
Boas práticas
●
    Não crie métodos de teste que não teste
    absolutamente nada
●
    Não queira testar várias situações em um
    método só
●
    Use os métodos corretos para comparações
    ●
        $this->assertEmpty($var); vs
        $this->assertTrue(empty($var));
    ●
        $this->assertInstanceOf('Exception', $e); vs
        $this->assertTrue($e instanceof Exception);
Boas práticas
●
     Crie um método de teste para cada condição
    de teste de um método usando nomes
    significativos
●
    Mantenha os diretórios de teste similares aos
    diretórios das classes
●
    Use arquivo de configuração com um arquivo
    de bootstrap
src/Lcobucci/Examples/Tests/Calculator.php
<?php
namespace LcobucciExamplesTests;

use InvalidArgumentException;

class Calculator
{
    public function div($dividend, $divisor)
    {
        if ($divisor == 0) {
            throw new InvalidArgumentException(
                 'The divisor cannot be ZERO'
            );
        }

          return $dividend / $divisor;
     }
}
test/Lcobucci/Examples/Tests/CalculatorTest.php
<?php
require_once 'src/Lcobucci/Examples/Tests/Calculator.php';
require_once 'PHPUnit/Framework/TestCase.php';
use LcobucciExamplesTestsCalculator;

class CalculatorTest extends PHPUnit_Framework_TestCase
{
    /**
      * @expectedException InvalidArgumentException
      */
    public function testDivisorCannotBeZero()
    {
         $calculator = new Calculator();
         $calculator->div(2, 0);
    }

    public function testDivMustReturnTheRightDivision()
    {
        $calculator = new Calculator();
        $this->assertEquals(2, $calculator->div(4, 2));
    }
}
Test Doubles
●
    São objetos “falsos” que utilizamos para isolar
    elementos que podem impedir a execução dos
    testes de unidade a qualquer momento e em
    qualquer ambiente, como:
    ●
        File system
    ●
        Database connections
    ●
        Socket connections
    ●
        HTTP requests
Test Doubles
●
    Dummy: são objetos que nunca são utilizados,
    são criados apenas para completar a lista de
    parâmetros exigidos
●
    Fake: objetos que implementados APENAS para
    testes, e que NÃO DEVEM ser utilizados em
    produção (ex: conexão com DB em memória)
●
    Stubs: objetos que retornam dados falsos
●
    Mocks: parecido com stubs, porém além de
    retornar verifica número de chamadas e
    parâmetros utilizados
test/Lcobucci/Examples/Tests/CalculatorTest.php (EXEMPLO stub)
<?php
require_once 'src/Lcobucci/Examples/Tests/Calculator.php';
require_once 'src/Lcobucci/Utils/FileLog.php';
require_once 'PHPUnit/Framework/TestCase.php';
use LcobucciExamplesTestsCalculator;
class CalculatorTest extends PHPUnit_Framework_TestCase
{
    public function testLoggerCanBeAttached()
    {
        $logger = $this->getMock(
            'LcobucciUtilsFileLog',
            array('log')
        );
        $logger->expects($this->any())
               ->method('log')
               ->will($this->returnValue(true));
        $calculator = new Calculator($logger);
        $this->assertEquals(2, $calculator->div(4, 2));
    }
}
test/Lcobucci/Examples/Tests/CalculatorTest.php (EXEMPLO mock)
<?php
require_once 'src/Lcobucci/Examples/Tests/Calculator.php';
require_once 'src/Lcobucci/Utils/FileLog.php';
require_once 'PHPUnit/Framework/TestCase.php';

use LcobucciExamplesTestsCalculator;
class CalculatorTest extends PHPUnit_Framework_TestCase
{
    public function testMathOperationsMustBeLogged()
    {
        $logger = $this->getMock(
            'LcobucciUtilsFileLog',
            array('log')
        );

        $logger->expects($this->one())
               ->method('log')
               ->with('div', array(4, 2), 2)
               ->will($this->returnValue(true));

        $calculator = new Calculator($logger);
        $this->assertEquals(2, $calculator->div(4, 2));
    }
}
Outras funcionalidades
●
    Dependência entre métodos de teste
●
    Acessar atributos privados
●
    Acessar métodos privados
test/Lcobucci/Examples/Tests/StackTest.php
<?php
require_once 'PHPUnit/Framework/TestCase.php';

class StackTest extends PHPUnit_Framework_TestCase
{
    public function testStackIsInitiallyEmpty()
    {
        $stack = array();
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
      * @depends testStackIsInitiallyEmpty
      */
    public function testAddingAnElementWorks(array $stack)
    {
         array_push($stack, 'test');
         $this->assertEquals('test', $stack[count($stack) - 1]);
    }
}
test/Lcobucci/Examples/Tests/PrivateAttributeTest.php
Não é uma boa prática, mas de vez em quando é necessário...
<?php
require_once 'PHPUnit/Framework/TestCase.php';

class PrivateAttributeTest extends PHPUnit_Framework_TestCase
{
    public function testPrivateAttribute()
    {
        $this->assertEquals(
            'teste',
            $this->readAttribute(
                new MyClass(),
                'myPrivateAttribute'
            )
        );
    }
}
test/Lcobucci/Examples/Tests/PrivateAttributeTest.php
Não é uma boa prática, mas de vez em quando é necessário...
<?php
require_once 'PHPUnit/Framework/TestCase.php';

class PrivateAttributeTest extends PHPUnit_Framework_TestCase
{
    public function testPrivateAttribute()
    {
        $this->assertAttributeEquals(
            'teste',
            'myPrivateAttribute',
             new MyClass()
        );
    }
}
test/Lcobucci/Examples/Tests/PrivateMethodTest.php
Não é uma boa prática, mas de vez em quando é necessário...
<?php
require_once 'PHPUnit/Framework/TestCase.php';

class PrivateMethodTest extends PHPUnit_Framework_TestCase
{
    public function testPrivateMethod()
    {
        $obj = new MyClass();
        $method = new ReflectionMethod(
            $obj, 'myPrivateMethod'
        );
        $method->setAccessible(true);

        $this->assertEquals(
            2,
            $method->invoke($obj, 4, 2)
        );
    }
}
Facilitadores dos testes de
unidade
●
    Baixo acoplamento
●
    Alta coesão
●
    Injeção de dependências
●
    Métodos pequenos
Complicadores dos testes de
unidade
●
    Escopo global
●
    Atributos e métodos estáticos
●
    Singleton
●
    Tarefas no construtor da classe
Test Driven Development
 “Test Driven Development (TDD) ou em português
 Desenvolvimento dirigido por testes é uma técnica de
 desenvolvimento de software que baseia em um ciclo
 curto de repetições: Primeiramente o desenvolvedor
 escreve um caso de teste automatizado que define uma
 melhoria desejada ou uma nova funcionalidade. Então, é
 produzido código que possa ser validado pelo teste
 para posteriormente o código ser refatorado para um
 código sob padrões aceitáveis.”

 http://pt.wikipedia.org/wiki/Test_Driven_Development
Só isso??
Benefícios do TDD
●
    Diminui ou até elimina a otimização prematura
●
    Código simples, eficaz e eficiente
●
    Cenários de testes bem definidos
Hora do exemplo!
E pra enfrentar bugs, como fica?
TDD na correção de bugs
1. Escreva um cenário de teste que reproduza o
  erro
2. Resolva o problema no código fonte (não
  pensa em deixar bonito, resolva o problema)
3. Execute os testes para garantir que nada foi
  comprometido
4. Refatore o código corrigido (agora sim pra
  deixar bonito)
5. Execute os testes novamente e seja feliz =D
Dúvidas???
Obrigado!

Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci


Avalie essa palestra: http://joind.in/3938

Weitere ähnliche Inhalte

Was ist angesagt?

TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Testando Aplicações com PHPT
Testando Aplicações com PHPTTestando Aplicações com PHPT
Testando Aplicações com PHPTSidney Souza
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
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
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...As Zone
 
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
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitárioselliando dias
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Djangofabiocerqueira
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Excecoes
ExcecoesExcecoes
ExcecoesEMSNEWS
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - SeleniumCaue Guerra
 

Was ist angesagt? (20)

TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
Testando Aplicações com PHPT
Testando Aplicações com PHPTTestando Aplicações com PHPT
Testando Aplicações com PHPT
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
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
 
Vivendo de hacking
Vivendo de hackingVivendo de hacking
Vivendo de hacking
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
Burlando Waf 2.0
Burlando Waf  2.0Burlando Waf  2.0
Burlando Waf 2.0
 
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...
Fisl 16 - Nem tudo o que reluz é ouro. hackeando as principais dicas de dese...
 
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
 
Shell script
Shell scriptShell script
Shell script
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
burlando um WAF
burlando um WAFburlando um WAF
burlando um WAF
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Django
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Excecoes
ExcecoesExcecoes
Excecoes
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - Selenium
 

Andere mochten auch

Produccion y desarrollo de un videojuego
Produccion y desarrollo de un videojuegoProduccion y desarrollo de un videojuego
Produccion y desarrollo de un videojuegodfhs
 
Material de Adviento 2016
Material de Adviento   2016Material de Adviento   2016
Material de Adviento 2016cristinamoreubi
 
Neurociencias - Bases neurológicas de la psicología humana
Neurociencias - Bases neurológicas de la psicología humanaNeurociencias - Bases neurológicas de la psicología humana
Neurociencias - Bases neurológicas de la psicología humanaJosé Luis Ayerbe
 
Estrategia española sobre discapacidad 2012 2020
Estrategia española sobre discapacidad  2012 2020Estrategia española sobre discapacidad  2012 2020
Estrategia española sobre discapacidad 2012 2020José María
 
CTET 20th September Paper-2 2015 Answer Key by Success Mantra
CTET 20th September Paper-2 2015 Answer Key by Success MantraCTET 20th September Paper-2 2015 Answer Key by Success Mantra
CTET 20th September Paper-2 2015 Answer Key by Success MantraSuccessMantraInstitute
 
Administracion Empresarial 122116
Administracion Empresarial 122116Administracion Empresarial 122116
Administracion Empresarial 122116guest168dfd6
 
Interacciones Farmacológicas
Interacciones FarmacológicasInteracciones Farmacológicas
Interacciones FarmacológicasCIMSFHUVH
 
4a imagen reputacion_villafane
4a imagen reputacion_villafane4a imagen reputacion_villafane
4a imagen reputacion_villafaneAnayde15
 
Estructura Organizacional
Estructura OrganizacionalEstructura Organizacional
Estructura Organizacionalmatias vasquez
 

Andere mochten auch (20)

Produccion y desarrollo de un videojuego
Produccion y desarrollo de un videojuegoProduccion y desarrollo de un videojuego
Produccion y desarrollo de un videojuego
 
Matriz foda
Matriz fodaMatriz foda
Matriz foda
 
Higiene ocupacional
Higiene ocupacionalHigiene ocupacional
Higiene ocupacional
 
26-02-14 Pobreza Extrema en México y su Evaluación
26-02-14 Pobreza Extrema en México y su Evaluación26-02-14 Pobreza Extrema en México y su Evaluación
26-02-14 Pobreza Extrema en México y su Evaluación
 
Material de Adviento 2016
Material de Adviento   2016Material de Adviento   2016
Material de Adviento 2016
 
Innovacion social
Innovacion socialInnovacion social
Innovacion social
 
ABOUT COLOR
ABOUT COLORABOUT COLOR
ABOUT COLOR
 
SISTEMA DE GESTION AMBIENTAL ISO 14001
SISTEMA DE GESTION AMBIENTAL ISO 14001SISTEMA DE GESTION AMBIENTAL ISO 14001
SISTEMA DE GESTION AMBIENTAL ISO 14001
 
Neurociencias - Bases neurológicas de la psicología humana
Neurociencias - Bases neurológicas de la psicología humanaNeurociencias - Bases neurológicas de la psicología humana
Neurociencias - Bases neurológicas de la psicología humana
 
Acordeon
AcordeonAcordeon
Acordeon
 
INTENSIDAD,RESISTENCIA Y VOLTAJE
INTENSIDAD,RESISTENCIA Y VOLTAJEINTENSIDAD,RESISTENCIA Y VOLTAJE
INTENSIDAD,RESISTENCIA Y VOLTAJE
 
Digesto docentes final
Digesto docentes finalDigesto docentes final
Digesto docentes final
 
Disoluciones resueltos
Disoluciones resueltosDisoluciones resueltos
Disoluciones resueltos
 
Estrategia española sobre discapacidad 2012 2020
Estrategia española sobre discapacidad  2012 2020Estrategia española sobre discapacidad  2012 2020
Estrategia española sobre discapacidad 2012 2020
 
CTET 20th September Paper-2 2015 Answer Key by Success Mantra
CTET 20th September Paper-2 2015 Answer Key by Success MantraCTET 20th September Paper-2 2015 Answer Key by Success Mantra
CTET 20th September Paper-2 2015 Answer Key by Success Mantra
 
Administracion Empresarial 122116
Administracion Empresarial 122116Administracion Empresarial 122116
Administracion Empresarial 122116
 
Interacciones Farmacológicas
Interacciones FarmacológicasInteracciones Farmacológicas
Interacciones Farmacológicas
 
Normas Generales De Auditoria
Normas Generales De AuditoriaNormas Generales De Auditoria
Normas Generales De Auditoria
 
4a imagen reputacion_villafane
4a imagen reputacion_villafane4a imagen reputacion_villafane
4a imagen reputacion_villafane
 
Estructura Organizacional
Estructura OrganizacionalEstructura Organizacional
Estructura Organizacional
 

Ähnlich wie Testes de unidade e TDD SoLiSC 2011

TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...Bruno Tanoue
 
Teste cabra da peste
Teste cabra da pesteTeste cabra da peste
Teste cabra da pesteMichele Silva
 
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
 
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
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Bruno Maomeh
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Edlaine Zamora
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Luís Cobucci
 
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
 
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
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Luís Cobucci
 
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...minastestingconference
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaGabriela Patuci
 
Testes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasTestes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasWordCamp Floripa
 

Ähnlich wie Testes de unidade e TDD SoLiSC 2011 (20)

TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
 
Teste cabra da peste
Teste cabra da pesteTeste cabra da peste
Teste cabra da peste
 
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
 
Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016
 
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
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
 
Mini Curso de PHP
Mini Curso de PHPMini Curso de PHP
Mini Curso de PHP
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
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
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
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...
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
 
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...
Criando um ambiente real de distribuição de aplicativos usando TestFairy: Mai...
 
Selenium IDE
Selenium IDESelenium IDE
Selenium IDE
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
 
Testes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasTestes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio Nas
 

Testes de unidade e TDD SoLiSC 2011

  • 1. Testes de unidade avançados e TDD Luís Otávio Cobucci Oblonczyk 21 de Outubro de 2011 6° SoLiSC
  • 2. Luís Otávio Cobucci Oblonczyk ● Desenvolvedor PHP na Softnex Tecnologia ● Orientador no Senac TI ● Doido por PHP desde 2003 ● Perfeccionista ao extremo =P @lcobucci http://about.me/lcobucci
  • 3. Normalmente quando desenvolvemos fazemos o teste F5
  • 4. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser
  • 5. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro
  • 6. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código
  • 7. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código 4) F5
  • 8. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código 4) F5 5) Muda o código
  • 9. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código 4) F5 5) Muda o código 6) F5
  • 10. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código 4) F5 5) Muda o código 6) F5 …
  • 11. Normalmente quando desenvolvemos fazemos o teste F5 1) Abre sistema no browser 2) Procura o erro 3) Muda o código 4) F5 5) Muda o código 6) F5 … 999) Resolve o problema
  • 12. Quanto tempo PERDEMOS nesta brincadeira?
  • 13. Quanto dinheiro PERDEMOS nesta brincadeira?
  • 14.
  • 15. E a pergunta que não quer calar...
  • 16.
  • 17. Quando isso acontece num ambiente “separado” não tem GRANDES problemas
  • 18. E quando acontece na “vida real”?
  • 19. Tá, e o que eu posso fazer?
  • 20. Tá, e o que eu posso fazer? Automatizar alguns testes! (pra começar)
  • 21. Testes de Unidade “Teste de unidade é toda a aplicação de teste nas assinaturas de entradas e saídas de um sistema, consiste em validar dados válidos e inválidos via I/O (entrada/saída) sendo aplicado por desenvolvedores ou analistas de teste. Uma unidade é a menor parte testável de um programa de computador.” http://pt.wikipedia.org/wiki/Teste_de_unidade
  • 22. Testes de Unidade ● Te dá uma visão rápida do teu código: ou funciona ou não funciona ● Facilita o desenvolvimento, pois caso alguma alteração estrague uma funcionalidade já existente, você fica sabendo antes mesmo de ser enviado para os sistemas de controle de versão ● Servem também como parte da documentação ● Ajuda a manter a sanidade mental da equipe
  • 24. Utilizarei aqui funcionalidades presentes a partir do PHP 5.3.2! Se você ainda não usa o PHP 5.3 é uma boa oportunidade de começar ; )
  • 25. PHPUnit O que é: Framework p/ criação e execução de testes de unidade. Faz parte da família xUnit. Criador: Sebastian Bergmann Instalação: pear config-set auto_discover 1 pear install pear.phpunit.de/PHPUnit http://www.phpunit.de
  • 27. src/Lcobucci/Examples/Tests/Calculator.php <?php namespace LcobucciExamplesTests; class Calculator { public function sum($number1, $number2) { return $number1 + $number2; } }
  • 28. test/Lcobucci/Examples/Tests/CalculatorTest.php <?php require_once 'src/Lcobucci/Examples/Tests/Calculator.php'; require_once 'PHPUnit/Framework/TestCase.php'; use LcobucciExamplesTestsCalculator; class CalculatorTest extends PHPUnit_Framework_TestCase { public function testSum() { $calculator = new Calculator(); $this->assertEquals(4, $calculator->sum(2, 2)); } }
  • 29. TestCase e TestSuite ● O TestCase possui métodos de testes para um recurso (normalmente uma classe) ● TestSuites formam grupos de testes, ou seja dentro de um TestSuite podem ter vários TestCases ou até vários TestSuites
  • 30. tearDown() e setUp() ● São métodos protegidos (com visibilidade protected) disponíveis tanto no TestCase quanto no TestSuite ● Podem ser sobrecarregados caso NECESSÁRIO, e são utilizados para preparar e limpar o ambiente de teste ● No TestCase o setUp() é executado ANTES de cada método de teste e o tearDown ao FINAL de cada método
  • 31. tearDown() e setUp() ● No TestSuite o setUp() é executado ANTES de cada item da suite de testes e o tearDown ao FINAL de cada item
  • 32. Boas práticas ● Não crie métodos de teste que não teste absolutamente nada ● Não queira testar várias situações em um método só ● Use os métodos corretos para comparações ● $this->assertEmpty($var); vs $this->assertTrue(empty($var)); ● $this->assertInstanceOf('Exception', $e); vs $this->assertTrue($e instanceof Exception);
  • 33. Boas práticas ● Crie um método de teste para cada condição de teste de um método usando nomes significativos ● Mantenha os diretórios de teste similares aos diretórios das classes ● Use arquivo de configuração com um arquivo de bootstrap
  • 34. src/Lcobucci/Examples/Tests/Calculator.php <?php namespace LcobucciExamplesTests; use InvalidArgumentException; class Calculator { public function div($dividend, $divisor) { if ($divisor == 0) { throw new InvalidArgumentException( 'The divisor cannot be ZERO' ); } return $dividend / $divisor; } }
  • 35. test/Lcobucci/Examples/Tests/CalculatorTest.php <?php require_once 'src/Lcobucci/Examples/Tests/Calculator.php'; require_once 'PHPUnit/Framework/TestCase.php'; use LcobucciExamplesTestsCalculator; class CalculatorTest extends PHPUnit_Framework_TestCase { /** * @expectedException InvalidArgumentException */ public function testDivisorCannotBeZero() { $calculator = new Calculator(); $calculator->div(2, 0); } public function testDivMustReturnTheRightDivision() { $calculator = new Calculator(); $this->assertEquals(2, $calculator->div(4, 2)); } }
  • 36. Test Doubles ● São objetos “falsos” que utilizamos para isolar elementos que podem impedir a execução dos testes de unidade a qualquer momento e em qualquer ambiente, como: ● File system ● Database connections ● Socket connections ● HTTP requests
  • 37. Test Doubles ● Dummy: são objetos que nunca são utilizados, são criados apenas para completar a lista de parâmetros exigidos ● Fake: objetos que implementados APENAS para testes, e que NÃO DEVEM ser utilizados em produção (ex: conexão com DB em memória) ● Stubs: objetos que retornam dados falsos ● Mocks: parecido com stubs, porém além de retornar verifica número de chamadas e parâmetros utilizados
  • 38. test/Lcobucci/Examples/Tests/CalculatorTest.php (EXEMPLO stub) <?php require_once 'src/Lcobucci/Examples/Tests/Calculator.php'; require_once 'src/Lcobucci/Utils/FileLog.php'; require_once 'PHPUnit/Framework/TestCase.php'; use LcobucciExamplesTestsCalculator; class CalculatorTest extends PHPUnit_Framework_TestCase { public function testLoggerCanBeAttached() { $logger = $this->getMock( 'LcobucciUtilsFileLog', array('log') ); $logger->expects($this->any()) ->method('log') ->will($this->returnValue(true)); $calculator = new Calculator($logger); $this->assertEquals(2, $calculator->div(4, 2)); } }
  • 39. test/Lcobucci/Examples/Tests/CalculatorTest.php (EXEMPLO mock) <?php require_once 'src/Lcobucci/Examples/Tests/Calculator.php'; require_once 'src/Lcobucci/Utils/FileLog.php'; require_once 'PHPUnit/Framework/TestCase.php'; use LcobucciExamplesTestsCalculator; class CalculatorTest extends PHPUnit_Framework_TestCase { public function testMathOperationsMustBeLogged() { $logger = $this->getMock( 'LcobucciUtilsFileLog', array('log') ); $logger->expects($this->one()) ->method('log') ->with('div', array(4, 2), 2) ->will($this->returnValue(true)); $calculator = new Calculator($logger); $this->assertEquals(2, $calculator->div(4, 2)); } }
  • 40. Outras funcionalidades ● Dependência entre métodos de teste ● Acessar atributos privados ● Acessar métodos privados
  • 41. test/Lcobucci/Examples/Tests/StackTest.php <?php require_once 'PHPUnit/Framework/TestCase.php'; class StackTest extends PHPUnit_Framework_TestCase { public function testStackIsInitiallyEmpty() { $stack = array(); $this->assertEmpty($stack); return $stack; } /** * @depends testStackIsInitiallyEmpty */ public function testAddingAnElementWorks(array $stack) { array_push($stack, 'test'); $this->assertEquals('test', $stack[count($stack) - 1]); } }
  • 42. test/Lcobucci/Examples/Tests/PrivateAttributeTest.php Não é uma boa prática, mas de vez em quando é necessário... <?php require_once 'PHPUnit/Framework/TestCase.php'; class PrivateAttributeTest extends PHPUnit_Framework_TestCase { public function testPrivateAttribute() { $this->assertEquals( 'teste', $this->readAttribute( new MyClass(), 'myPrivateAttribute' ) ); } }
  • 43. test/Lcobucci/Examples/Tests/PrivateAttributeTest.php Não é uma boa prática, mas de vez em quando é necessário... <?php require_once 'PHPUnit/Framework/TestCase.php'; class PrivateAttributeTest extends PHPUnit_Framework_TestCase { public function testPrivateAttribute() { $this->assertAttributeEquals( 'teste', 'myPrivateAttribute', new MyClass() ); } }
  • 44. test/Lcobucci/Examples/Tests/PrivateMethodTest.php Não é uma boa prática, mas de vez em quando é necessário... <?php require_once 'PHPUnit/Framework/TestCase.php'; class PrivateMethodTest extends PHPUnit_Framework_TestCase { public function testPrivateMethod() { $obj = new MyClass(); $method = new ReflectionMethod( $obj, 'myPrivateMethod' ); $method->setAccessible(true); $this->assertEquals( 2, $method->invoke($obj, 4, 2) ); } }
  • 45. Facilitadores dos testes de unidade ● Baixo acoplamento ● Alta coesão ● Injeção de dependências ● Métodos pequenos
  • 46. Complicadores dos testes de unidade ● Escopo global ● Atributos e métodos estáticos ● Singleton ● Tarefas no construtor da classe
  • 47.
  • 48. Test Driven Development “Test Driven Development (TDD) ou em português Desenvolvimento dirigido por testes é uma técnica de desenvolvimento de software que baseia em um ciclo curto de repetições: Primeiramente o desenvolvedor escreve um caso de teste automatizado que define uma melhoria desejada ou uma nova funcionalidade. Então, é produzido código que possa ser validado pelo teste para posteriormente o código ser refatorado para um código sob padrões aceitáveis.” http://pt.wikipedia.org/wiki/Test_Driven_Development
  • 50. Benefícios do TDD ● Diminui ou até elimina a otimização prematura ● Código simples, eficaz e eficiente ● Cenários de testes bem definidos
  • 52. E pra enfrentar bugs, como fica?
  • 53. TDD na correção de bugs 1. Escreva um cenário de teste que reproduza o erro 2. Resolva o problema no código fonte (não pensa em deixar bonito, resolva o problema) 3. Execute os testes para garantir que nada foi comprometido 4. Refatore o código corrigido (agora sim pra deixar bonito) 5. Execute os testes novamente e seja feliz =D
  • 55. Obrigado! Eu por aí: http://about.me/lcobucci Slides: http://slideshare.net/lcobucci Avalie essa palestra: http://joind.in/3938