você está aqui: Home  → Arquivo de Mensagens

Testes Ágeis em PHP - parte 2

Por Cesar Brod

Data de Publicação: 23 de Maio de 2014

Antes de partirmos para os testes unitários em PHP, que são o assunto desta parte do artigo, como foi a sua jornada até aqui? Você experimentou rodar o PHPCheckstyle, através da linha de comando, em seu programa PHP? Fez a checagem de estilo através da interface do NetBeans? Conseguiu resolver todos os problemas de estilo?

Se você não alterou as configurações padrão do NetBeans é bem provável que você esteja sofrendo com a mensagem "Whitespace indentation must not be used" (a indentação com espaços em branco não deve ser usada). Isto é porque o editor do NetBeans substitui as suas tabulações, convenientemente, só que não, por espaços em branco. Para corrigir isso, vá para Ferramentas > Opções > Editor e, na aba Formatação, em Linguagem selecione PHP, em Categoria selecione Tabulações e Recuos e desmarque as opções Utilizar Todas as Definições de Idiomas e Expandir Guias para Espaços. Em Número de Espaços por Recuo e Tamanho da Guia coloque o número 2. Deixe as outras opções inalteradas. Clique em Aplicar e Ok. Agora veja se consegue verificar o estilo de seu programa e eliminar os erros.

Dica: Com seu programa selecionado, experimente clicar no menu em Código-Fonte > Formatar ou pressionar, simultaneamente, as teclas Alt + Shift + F.

Veja como ficou o nosso programa:

  <?php
  
  require 'calculadora.php';
  
  /**
  * Essa classe testa as funções da classe Calculadora
  */
  class TesteCalculadora extends PHPUnit_Framework_TestCase {
  
     /**
      * Instanciamos a Calculadora e verificamos se ela soma corretamente
      */
     public function testeSoma() {
         $c = New Calculadora;
         $resultado = $c->soma(4, 3);
         $this->assertEquals(7, $resultado);
     }

Ainda há mais coisas a configurar no NetBeans, como você pode ter percebido. Cobriremos algumas delas nos novos artigos desta série.

Testes Unitários com o PHPUnit

O desenvolvimento baseado em testes, ou orientado a testes (Test Driven Development) é uma prática que visa, dentre outras coisas, diminuir a possibilidade de erros na codificação e uma melhor compreensão do código que terá que ser escrito. Antes de qualquer código funcional ser escrito, são definidos os testes pelos quais ele deve passar. Isso pode parecer uma inversão lógica nas fases da programação mas, na prática, os resultados são um código mais limpo e menos sujeito a erros.

A melhor forma de entender essa prática do Extreme Programming é colocando mãos à obra com um exemplo simples: uma calculadora escrita em PHP (exemplo baseado nos vídeos disponibilizados pelo Tuts+ Code).

Preparando o ambiente

Você precisará ter o php5 instalado em sua máquina, assim como um ambiente que permita testes unitários (testes que cobrem cada uma das classes de seu programa, seus atributos e métodos). Se você trabalhar em um ambiente Linux, siga a receita a seguir:

  sudo apt-get install php5-cli curl php5-json

Se você já fez isso durante a leitura do artigo anterior, não precisa repetir o processo.

Os comandos acima instalam a interface de linha de comando para o php5, a ferramenta de recuperação de dados a partir da web curl e o JSON, um formato padrão para o intercâmbio de dados (Javascript Object Notation).

  curl -s http://getcomposer.org/installer | php

Esse comando busca o instalador do composer, um gerenciador de dependências para o php e efetivamente o instala, através do direcionamento ao interpretador da linguagem ( | php ). Entenda o composer como um auxiliar no encontro e utilização de bibliotecas e componentes que podem ser necessários ao desenvolvimento de um determinado programa.

Para testar se a instalação foi concluída sem problemas, execute o comando a seguir:

  php composer.phar

Uma lista de opções e argumentos que podem ser passados ao composer será exibida.

Agora, é preciso criar um arquivo json que informará ao composer as ferramentas para testes que utilizaremos. Crie um arquivo chamado composer.json com o seguinte conteúdo:

  {
   "require": {
     "eher/phpunit": "1.6"
   }
  }

Nota: para mais informações sobre os pacotes que podem ser instalados com o composer, visite a página https://packagist.org. Informações específicas sobre o eher/phpunit estão disponíveis nesse link.

O composer.json informa quais os pacotes devem ser instalados pelo composer. Para que a instalação se complete, você deve rodar o comando a seguir:

  php composer.phar install

Se você não obtiver nenhuma mensagem de erro, seu ambiente de testes está configurado.

Codificando uma calculadora, começando pelos seus testes

Comecemos por um exemplo bem simples, uma calculadora básica em PHP. Como você criaria os testes para a calculadora para a qual você ainda não escreveu nenhuma linha de código?

Por uma questão de organização, crie uma pasta chamada testes:

  mkdir testes

Dentro dela, crie um programa em php chamado teste_calculadora.php, com o seguinte conteúdo:

  <?php
  
  class TesteCalculadora extends PHPUnit_Framework_TestCase
  {
   public function testeSoma()
   {
     $c = New Calculadora;
     $resultado = $c->soma(4, 3);
     $this->assertEquals(7, $resultado);
   }
  }

O programa acima, por enquanto, esperará poder instanciar uma classe Calculadora e usá-la para testar a soma dos números 4 e 3, cujo resultado esperado é 7. Mesmo que você não conheça muito da linguagem PHP ou de orientação a objetos, basta saber que estamos estendendo (criando uma nova classe que herda os atributos e métodos de uma classe original) uma classe chamada PHPUnit_Framework_TestCase, interna ao ambiente de testes PHPUnit e chamada de TesteCalculadora. A função testeSoma é a que, efetivamente, instanciará (utilizará) a classe Calculadora e passará a ela dois números para que sejam somados.

Nota: caso você tenha que fazer alguma modificação em seu arquivo de configuração do php (php.ini), descubra qual é o arquivo apropriado com o comando:

  php -i |grep php\.ini

Vamos, agora, rodar o nosso teste da função soma para a nossa calculadora. Como ela nem existe ainda, o teste, obviamente, deve falhar. O composer instalou o phpunit dentro de uma pasta /vendor/eher/phpunit/bin - relativa ao local onde você rodou o instalador. Se você seguiu as instruções exatamente como estão aqui, esta pasta está dentro de sua pasta de usuário. Certifique-se de que os locais onde você instalou correspondem aos exemplos, ou faça a adequação necessária no comando a seguir:

  vendor/eher/phpunit/bin/phpunit testes/teste_calculadora.php

O erro que você obteve deve ser bastante parecido com o seguinte:

  PHP Fatal error:  Class 'Calculadora' not found in /home/user/testes/teste_calculadora.php on line 7

A partir desse teste, então, começamos a corrigir os problemas.

Primeiro, notificaremos nosso teste que a classe Calculadora estará no programa calculadora.php, acrescentando a linha em negrito ao programa teste_calculadora.php:

  <?php
  
  require 'calculadora.php';
  
  class TesteCalculadora extends PHPUnit_Framework_TestCase
  {
   public function testeSoma()
   {
     $c = New Calculadora;
     $resultado = $c->soma(4, 3);
     $this->assertEquals(7, $resultado);
   }
  }

O programa calculadora.php não existe, assim ele também precisa ser criado. Crie-o com o seguinte conteúdo:

  <?php
  
  class Calculadora {
  
  }

Ou seja, criamos apenas a classe que causou o erro. Mais nada! Lembre-se que, no Extreme Programming, apenas resolvemos um problema quando ele aparece. Verifique o estilo do programa recentemente criado (você já sabe como fazer isso), aproveite para corrigi-lo adequadamente, e rode novamente o teste:

  vendor/eher/phpunit/bin/phpunit testes/teste_calculadora.php

Como era de se esperar, o método soma ainda não existe e o teste acusa isso através do seguinte erro:

  PHP Fatal error:  Call to undefined method Calculadora::soma() in /var/home/brod/testes/teste_calculadora.php on line 10

Vamos corrigir mais esse problema, acrescentando o método à classe Calculadora no programa calculadora.php, editando-o para que corresponda ao seguinte:

  <?php
  
  class Calculadora {
   public function soma($a, $b)
   {
     return $a + $b;
   }
  }

Agora temos a classe Calculadora e o método soma que, se construído apropriadamente, não deve retornar mais nenhum erro. Confira!

  vendor/eher/phpunit/bin/phpunit testes/teste_calculadora.php

Que tal, como exercício, criar as funções de teste de subtração, multiplicação e divisão e seguir desenvolvendo a calculadora e trabalhando com um par, como recomenda a metodologia Extreme Programming?

Na próxima semana, veremos como implementar os testes unitários dentro do IDE NetBeans.

Conheça o livro "Scrum: Guia Prático para Projetos Ágeis", de autoria de Cesar Brod

Resenha: O maior desafio desta obra é tornar-se um livro de cabeceira e referência simultaneamente. A expectativa do autor é a de que os leitores o leiam de cabo a rabo e, ao final, o guardem na biblioteca pública de sua preferência para que ele esteja ao seu alcance e ao alcance de todos os demais que, por qualquer razão, não pagaram por ele.

O livro não discute se o Scrum é um processo de engenharia, um método ágil ou um conjunto de ferramentas. O Scrum é uma atitude. Aqui você encontrará histórias sobre o Scrum e métodos ágeis, começando por suas origens, suas aplicações, sempre ilustrando com casos práticos de uso. Várias referências serão apontadas (algumas escritas pelo próprio autor, outras em parceria com Joice Käfer), muitas mais ou menos acadêmicas, para enriquecer a experiência do leitor, mas apenas como acessórios à leitura deste livro.

Em resumo, aqui você encontrará história, contextualização, aplicação, método e documentação. Não espere encontrar burocracia, chatice e opressão. Todo método deve ser divertido. Qualquer livro deve ser prazeroso. Temos plena consciência dos excelentes competidores na prateleira a seu lado, atraindo sua visão.

Downloads

»»» Saiba mais sobre esta obra «««

Sobre o autor

Cesar Brod é empresário e consultor nos temas de inovação tecnológica, tecnologias livres, dados abertos e empreendedorismo. Sua empresa, a BrodTec, faz também trabalhos tradução e produção de conteúdo em inglês e português. Além de sua coluna, Cesar também contribui com dicas para o Dicas-L e mantém um blog com aleatoriedades e ousadias literárias. Você pode entrar em contato com ele através do formulário na página da BrodTec, onde você pode saber mais sobre os projetos da empresa.

Mais sobre o Cesar Brod: [ Linkedin ] | [ Twitter ] | [ Tumblr ].


Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS

Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.

Recomende este artigo nas redes sociais

 

 

Veja a relação completa dos artigos de Cesar Brod