Postagem

Aqui é onde faço postagens de coisas que acho interessante.

Introdução ao desenvolvimento guiado por testes

Postagem do dia 01/01/1970 na categoria Testes unitários



Test Driven Development (TDD) ou em português Desenvolvimento orientado a 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 para uma melhoria ou nova funcionalidade (Esse teste irá falhar, pois ainda não implementamos nossa funcionalidade). Depois que essa melhoria ou funcionalidade é codificada e o teste estiver passando deve-se refatorar o código.

Veja o ciclo do TDD logo abaixo:
Ciclo do TDD - Test Driven Development ou Testes Orientado à  Testes

Para visualizar melhor o ciclo, vamos imaginar que precisamos implementar uma calculadora e ela terá no momento somente a função de somar. Vamos usar a classe Simple Test para realizar nossos testes.

Primeiro vamos fazer um caso de teste, vamos testar um método chamado somar, o primeiro teste que vou fazer é se ele é capaz de somar dois números inteiros e retornar um valor esperado e um teste para testar se o método está aceitando somente números como parà¢metros.

TestCalculadora.php

<?php
require_once('simpletest/autorun.php');
require_once('Calculadora.class.php');

class TestCalculadora extends UnitTestCase {
    
    /**
     * Metodo que testa soma entre dois numeros inteiros
     * 
     * @access public
     * @return void
     */
    public function testSomaComNumerosInteiros(){
        $Calculadora = new Calculadora();
        $resultado = $Calculadora->somar(5, 7);
        $this->assertEqual($resultado, 12, 'Resultado referente a soma de 5 + 7 inesperado');
    }
    
    /**
     * Metodo que testa soma entre dois parametros, um como string e outro numero
     * 
     * @access public
     * @return void
     */
    public function testSomaComNumerosEstrings(){
        $Calculadora = new Calculadora();
        try{
            $result = $Calculadora->somar('A', 7);
            $this->fail('O metodo esta aceitando strings no lugar de numeros');
        } catch (Exception $e){
            $this->pass();
        }
    }   
}

Atenção: A classe SimpleTest possui vários métodos para testes, no nosso caso estou usando o $this->assertEqual() que testar se um determinado valor é igual ao outro, senão ele lanà§a uma falha e pode receber uma mensagem personalizada caso isso acorra.

Já nossa classe calculadora, tem apenas a descrição do método, mas sem sua implementação.

Calculadora.class.php

<?php
class Calculadora{
    /**
     * Metodo que realiza soma entre dois numeros
     */
    public function somar(){
        
    }
}


Ao executar o arquivo TestCalculadora.php ele irá imprimir a seguinte mensagem:

testCalculadora.php

Fail: TestCalculadora -> testSomaComNumerosInteiros -> Resultado referente a soma de 5 + 7 inesperado at [C:\xampp\htdocs\testes\testCalculadora.php line 33]

 

1/1 test cases complete: 0 passes, 1 fails and 0 exceptions.

 


Perfeito, vejam que temos nosso caso de teste funcionando e como não estamos na fase de implementação do nosso método somar, o nosso caso de este irá falhar.

Sabendo quais as entradas, o resultado esperado e o que nosso método deve fazer, iremos implementar em nossa classe Calculadora o método somar.

Calculadora.class.php

 

 

<?php
class Calculadora{
    /**
     * Metodo que realiza soma entre dois numeros
     * 
     * @access public
     * @param int $num1 Primeiro numero a ser usado na soma
     * @param int $num2 Segundo numero a ser usado na soma
     * @return int Resultado da soma
     */
    public function somar($num1 = 0, $num2 = 0){
        return $num1 + $num2;        
    }
}

 


Agora vamos executar nosso teste novamente e ver se vai passar.

 

testCalculadora.php

Fail: TestCalculadora -> testSomaComNumerosEstrings -> O metodo esta aceitando strings no lugar de numeros at [C:\xampp\htdocs\testes\testCalculadora.php line 44]

 

1/1 test cases complete: 1 passes, 1 fails and 0 exceptions.


Vejamos que nosso teste falhou e que esquecemos de validar se o método somar está recebendo somente números, então vamos implementar essa validação.

Calculadora.class.php

 

<?php
class Calculadora{
    /**
     * Metodo que realiza soma entre dois numeros
     * 
     * @access public
     * @param int $num1 Primeiro numero a ser usado na soma
     * @param int $num2 Segundo numero a ser usado na soma
     * @throws Exception O metodo somar aceita somente numeros
     * @return int Resultado da soma
     */
    public function somar($num1 = 0, $num2 = 0){
        if (!is_numeric($num1) OR !is_numeric($num2)){
            throw new Exception('O metodo somar aceita somente numeros');
        }
        return $num1 + $num2;        
    }
}


Agora vamos rodar o teste novamente e ver o resultado.

testCalculadora.php

1/1 test cases complete: 2 passes, 0 fails and 0 exceptions.

 


Pronto, nossa implementação foi feita com sucesso, ele fez dois testes onde os 2 passaram. De agora em diante sempre que se fizer uma alteração no método, deve-se rodar esse testes antes de coloca-lo em produção.

Espero que tenha dado para entender o conceito básico do desenvolvimento orientado à  testes.

 



Deixe seus comentários abaixo: