terça-feira, 28 de outubro de 2014

Test Driven Development (TDD) em PHP

Neste post vamos abordar o Test Driven Development (TDD) em PHP, que é um dos principios core do XP e está disponivel nativo para linguagem java no netbeans. Entretanto, para habilitar essa ferramenta para o PHP no ambiente Windows devemos fazer algumas configurações no ambiente que seguem:


  1. Instalar o NetBeans;
  2. Instalar o Xampp;
  3. Configurar o PHPUnit pelo pear no xampp com os seguintes comandos:
  4. Abrir o Shell;
  5. Digitar “pear config-set auto_discover 1”
  6. Digitar “pear install pear.phpunit.de/PHPUnit”
  7. Agora o PHPUnit já está configurado na pasta c:\xampp\php\
  8. Baixar o arquivo phpunit.phar em https://phar.phpunit.de/phpunit.phar
  9. Baixar o arquivo phpunit-skelgen.phar em https://phar.phpunit.de/phpunit-skelgen.phar
  10. Salvar os dois arquivos em c:\xampp\php\
  11. Para configurar o phpunit no netbeans faça o seguinte:
    1. Vá em ferramentas;
    2. Em opções aponte os arquivos conforme as imagens abaixo:



Agora o NetBeans já está configurado para aceitar projetos com a criação de classes de testes. A proxima etapa é criar um novo projeto PHP. Com o projeto criado deve-se criar a classe PHP que será desenvolvida a partir de testes. Agora deve-se criar os testes. Clique com o botão direito sobre a pasta “Arquivos de Código-Fonte” ir em “Ferramentas” e depois “Criar Testes”.


Deve-se criar uma pasta de testes dentro do projeto, onde serão geradas as classes de testes pelo skelgen, e durante o assistente de criação dos testes assinalar a opção de utilizar o PHPUnit.


O ultimo passo é criar a classe de testes, que é criada automaticamente clicando com o botão direito em cima do arquivo da classe PHP, que foi criada anteriormente e onde serão desenvolvidos os métodos,  ir em “Ferramentas” e depois “Criar Testes”.


Agora o arquivo o testes já foi criado, só tem que ter cuidado de sempre começar o método de testes começando com “testAlgumaCoisa”, segue abaixo uma sugestão de código para as classes onde estarão os métodos e onde estarão os testes:


Salario.php
<?php


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/


/**
* Description of Salario
*
* @author GUSTAVO
*/
class Salario {
   //put your code here
   
   public function index($bonus = null){
       $salario =  1500.35;
       
       if($bonus){
           $salario += $bonus;
       }
       
       return $salario;
   }
   
   public function desconto($salario){
       
       $desconto = 8;
       
       if(($salario > 1317.07) and ($salario < 2195.13)){
           $desconto = 9;
       } elseif($salario > 2195.12){
           $desconto = 11;
       }
       
       return $desconto;
   }


   public function descontoINSS($salario) {
       
       if($salario > 4390.24){
           $salario = 4390.24;
       }
       
       $percentual = $this->desconto($salario);
       
       $desconto = $salario * $percentual / 100;
       
       return number_format($desconto, 2);
   }


}


SalarioTest.php
<?php
require_once "../Salario.php";


/**
* Generated by PHPUnit_SkeletonGenerator on 2014-10-21 at 14:01:05.
*/
class SalarioTest extends PHPUnit_Framework_TestCase
{


   /**
    * @covers Salario::index
    * @todo   Implement testIndex().
    */
   public function testIndex(){
       $salario = new Salario();
       $this->assertEquals(1500.35, $salario->index());
   }
   
   public function testIndexComBonus(){
       $salario = new Salario();
       $this->assertEquals(1550.35, $salario->index(50));
   }


   public function testDesconto(){
       $salario = new Salario();
       $this->assertEquals(11, $salario->desconto(10000));
   }
   
   public function testValorINSSMinimo(){
       $salario = new Salario();
       $this->assertEquals(80, $salario->descontoINSS(1000));
   }
   
   public function testValorINSSMedio(){
       $salario = new Salario();
       $this->assertEquals(180, $salario->descontoINSS(2000));
   }
   
   public function testValorINSSAlto(){
       $salario = new Salario();
       $this->assertEquals(440, $salario->descontoINSS(4000));
   }
   
   public function testValorINSSTeto(){
       $salario = new Salario();
       $this->assertEquals(482.93, $salario->descontoINSS(9390.24));
   }


}

Nenhum comentário:

Postar um comentário