BIGtheme.net http://bigtheme.net/ecommerce/opencart OpenCart Templates

PHP TESTING (PARTE 1): TESTES DE UNIDADE COM PHPUNIT

A linguagem de programação PHP tem crescido muito nos últimos anos, tornando-se muito robusta e padronizada.

Uma vez que testar o software é algo imprescindível, muitos frameworks foram criados para suportar esta atividade dentro da linguagem PHP, como por exemplo o PHPUnit, Behat, Facebook Webdriver e muitos outros.

Esta série visa demonstrar alguns frameworks que podem lhe ajudar na atividade de automatizar testes e será dividida em 4 partes:

  • Parte 1: Testes de Unidade com PHPUnit
  • Parte 2: Testes em APIs Rest com PHPUnit e Guzzle
  • Parte 3: Testes em aplicações web com PHPUnit e Facebook Webdriver
  • Parte 4: Testes em aplicações web com Behat e Facebook Webdriver

Preparando a máquina

Você precisará instalar em sua máquina os softwares abaixo, siga os tutorias de instalação contidos nos links abaixo:

– MAMP ou XAMPP (https://www.mamp.info/en/)

É um servidor web, contém internamente o PHP, MySQL e Apache, componentes necessários para executar uma aplicação web PHP.

Dentro do diretório onde ele será instalado existe um diretório chamado “htdocs”, salvaremos nosso projeto dentro dele e então poderemos acessar a aplicação a partir do endereço http://localhost/nome-da-aplicacao

– Composer (https://getcomposer.org/doc/00-intro.md)

É um gerenciador de dependências, utilizado para facilitar a criação de projetos PHP.

– PHPUnit (https://phpunit.de/getting-started.html)

É o framework utilizado para criar e executar testes de unidade em PHP.

Variáveis globais

Para facilitar a criação dos testes, adicione o caminho dos binários do Composer e PHPUnit nas variáveis globais de seu sistema operacional.

Após adicionar as variáveis globais, abra o prompt de comando e digite o comando abaixo:

composer —version

E então verá uma mensagem semelhante a esta:

Composer version 1.0-dev (c43a39f7334ae3df968cd36a6eff0436bea0da75) 2015-06-22 12:25:03

Depois digite:

phpunit —version

E então verá uma mensagem semelhante a esta:

PHPUnit 4.7.5 by Sebastian Bergmann and contributors.

IDE

Utilizaremos o Eclipse for PHP Developers como IDE nesta série, ele nos ajuda a ter mais produtividade uma vez que possui mecanismo de autocomplete de métodos, classes, variáveis e etc.

Faça download aqui:

https://eclipse.org/downloads/packages/eclipse-php-developers/lunar

Criando o projeto

Passo 1:

Abra o Eclipse e então clique em File > New > Project…

Passo 2:

Escolha a opção PHP Project, dê o nome “qualister-php-testing”, e escolha salvar o projeto dentro do diretório htdocs/qualister-php-testing do MAMP/XAMPP.

Passo 3:

Crie os diretórios “src” e “test” na raiz do projeto, para isso, clique com o botão direito no item que possui o nome do projeto e então escolha a opção New > Folder.

Passo 4:

Crie um arquivo na raiz do projeto chamado composer.json, para tal, clique com o botão direito no item que possui o nome do projeto e selecione a opção New > File.

Passo 5:

Cole o conteúdo abaixo dentro do arquivo composer.json:

{
    "require-dev": {
        "phpunit/phpunit": "4.7.*"
    },
    "autoload": {
       "classmap": [
			"src" 
		]
	}
}

– “require-dev” aponta quais são as dependências que teremos neste projeto, no caso, apenas a do PHPUnit, versão maior ou igual que 4.7 e menor que 4.8.

– “autoload / classmap” aponta onde serão armazenadas as classes de nossa aplicação.

Passo 6:

Abra o prompt de comando e acesse o diretório “qualister-php-testing”, então execute o comando abaixo:

composer install

Este comando irá baixar a dependência do pHPUnit que foi declarada no arquivo composer.json, além disso irá varrer o diretório “src” em busca de arquivos PHP e então irá os adicionar ao arquivo de autoload, que está armazenado no diretório “vendor/autoload.php” contido na raiz do projeto.

Este arquivo “autoload.php” serve para incluir todos as classes e dependências automaticamente ao seu projeto.

Passo 7:

Valide que seu projeto agora possui a seguinte estrutura:

- htdocs
  - qualister-php-testing
    - src
    - test
    - vendor
      ...
      - phpunit
      ...
    - composer.json
    - composer.lock

Configurando o PHPUnit

Podemos fazer configurações iniciais no PHPUnit criando o arquivo phpunit.xml, para tal, crie este arquivo na raiz do projeto e cole o conteúdo abaixo dentro dele:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php" colors="true" stopOnFailure="false"></phpunit>

– “bootstrap” aponta qual é o arquivo de autoload que você deseja carregar sempre que os testes forem executados.

– “colors” define se os resultados aparecerão coloridos no console, por exemplo, testes que passaram em verde e os que falharam e vermelho.

– “stopOnFailure” define se queremos que a execução dos testes pare completamente se um dos testes vier a falhar.

Executando os testes

Para executar os testes, basta abrir o diretório “qualister-php-testing” no prompt de comando:

phpunit test

E então veremos a seguinte mensagem:

No tests executed!

Isso porque nenhum método de teste foi encontrado no diretório mencionado.

| Escrevendo nosso primeiro teste

Passo 1:

Crie o arquivo “PedidoTest.php” no diretório “test”

Passo 2:

Declare a classe PedidoTest dentro do arquivo e extenda-a a PHPUnit_Framework_TestCase, ficará assim:

<?php
   class PedidoTest extends PHPUnit_Framework_TestCase
   {

   }
?>

Passo 3:

Execute o phpunit apontando para o arquivo PedidoTest.php:

phpunit test/PedidoTest.php

E então verá a mensagem:

No tests found in class "PedidoTest".

Passo 4:

Crie seu primeiro método de teste usando a anotação @test e um nome sugestivo, no nosso caso, será criarPedidoEntaoListaEstaraVazia, veja:

/**
 * @test
*/
public function criarPedidoEntaoListaEstaraVazia()
{

}

Passo 5:

Execute o phpunit apontando para o arquivo PedidoTest.php:

phpunit test/PedidoTest.php

E então verá a mensagem:

OK (1 test, 0 assertions)

Veja que o teste, mesmo estando vazio, foi interpretado como válido.

Passo 6:

Vamos adicionar conteúdo ao teste, então, usaremos a estrutura AAA (Arrange, Act e Arrange), que significa Preparar, Agir e Validar, ficará assim:

/**
 * @test
*/
public function criarPedidoEntaoListaEstaraVazia()
{
   // Arrange

   // Act

   // Arrange
}

Passo 7:

Agora vamos criar o teste, que, basicamente, instanciará a classe Pedido, depois atribuirá a uma variável os itens deste pedido e por fim, validará que a quantidade de itens do pedido é 0, veja:

/**
 * @test
*/
public function criarPedidoEntaoListaEstaraVazia()
{
   // Arrange
   $pedido = new Pedido();

   // Act
   $itens = $pedido->getItens();

   // Arrange
   $this->assertCount(0, $itens);
}

Passo 8:

Execute o phpunit apontando para o arquivo PedidoTests.php:

phpunit test/PedidoTest.php

E então verá a mensagem:

There was 1 error:

1) PedidoTest::criarPedidoEntaoListaEstaraVazia
include(/Applications/MAMP/htdocs/workshop-php-testing/src/Pedido.php): failed to open stream: No such file or directory

Isso porque ainda não criamos a classe Pedido, o padrão TDD segue esse conceito: Primeiro o teste falha, pois não existe o código, e então fazemos o código para atender o teste.

Então, vamos lá!

Criando a aplicação para atender ao teste

Passo 1:

Crie o arquivo “Pedido.php” no diretório “src”, então adicione o código abaixo:

<?php
   class Pedido
   {

   }
?>

Passo 2:

Rode o comando abaixo no diretório raiz do projeto:

composer update

Assim o composer irá adicionar o arquivo que acabamos de criar à lista do autoload.

Passo 3:

Rode o comando abaixo para executar os testes:

phpunit test/PedidoTest.php

Então veremos o resultado abaixo:

Fatal error: Call to undefined method Pedido::getItens() in /Applications/MAMP/htdocs/workshop-php-testing/test/PedidoTest.php on line 13

Isso quer dizer que o método getItens() ainda não foi declarado.

Passo 4:

Declare o método getItens() na classe Pedido, da seguinte forma:

public function getItens()
{
   return [];
}

Agora execute o comando abaixo para executar os testes:

phpunit test/PedidoTest.php

Então veremos a mensagem abaixo:

OK (1 test, 1 assertion)

Passou, mas nosso código foi construído apenas para fazer o teste passar, agora é hora de refatorar o código e deixá-lo pronto para ser utilizado.

Passo 5:

Refatore o código, e então ele ficará assim:

private $pedidoitens;
   		
public function Pedido()
{
   $this->pedidoitens = [];
}
   		
public function getItens()
{
   return $this->pedidoitens;
}

Passo 6:

Agora execute o comando abaixo para executar os testes:

phpunit test/PedidoTest.php

Então veremos a mensagem abaixo:

OK (1 test, 1 assertion)

Ou seja, mesmo depois da refatoração nossa aplicação continua funcionando corretamente!

Passo 7:

Digamos que o código foi alterado e um bug foi introduzido:

public function Pedido()
{
   $this->pedidoitens = 0;
}

A adição do “0” ao invés de “[]”, mudou o tipo da variável de array para inteiro. Agora execute os testes para vermos o que ocorrerá:

phpunit test/PedidoTest.php

Olhe, agora o teste nos mostra que adicionamos uma falha:

1) PedidoTests::criarPedidoEntaoListaEstaraVazia
PHPUnit_Framework_Exception: Argument #2 (No Value) of PHPUnit_Framework_Assert::assertCount() must be a countable or traversable

A mensagem nos informa que o resultado contido no segundo parâmetro da asserção não é contável (não é um vetor/lista), reveja a asserção:

$this->assertCount(0, $itens);

Agora, ao concertar o código:

public function Pedido()
{
   $this->pedidoitens = [];
}

E reexecutar os testes:

phpunit test/PedidoTest.php

Veremos a mensagem de sucesso novamente:

OK (1 test, 1 assertion)

Conclusão

Vemos que nos testes de unidade o código é alvo dos testes, e cada teste garante que um trecho de código funciona corretamente.

Aprendemos na prática como criar um teste e uma aplicação em paralelo e vimos alguns desafios, como o de pensar primeiro no teste para depois pensar na aplicação, mas vemos que nos dá tranquilidade, uma vez que, mesmo que algum bug seja introduzido no código, o teste nos dirá imediatamente, evitando erros em etapas futuras.

Sobre o PHPUnit

O PHPUnit possui uma série de funcionalidades, você pode ter acesso a elas a partir do site do phpunit (phpunit.de) ou mesmo em livros e tutoriais na internet.

A Qualister oferece curso de PHPUnit, conheça a ementa acessando o link abaixo:

http://www.qualister.com.br/cursos/automacao-de-testes-de-unidade-com-phpunit

 

Autor: Júlio de Lima (julio.lima@qualister.com.br)

About Júlio de Lima

Avatar
Especialista em teste de software com ênfase em automação de testes de software, possui formação em Tecnologia da Informação e certificações internacionais (CTFL e CTAL-TM pelo ISTQB) e nacional (CBTS pela ALATS) relacionada a testes de software além de ser certificado na ferramenta SoapUI Pro pela SmartBear Software. Atualmente é consultor de automação de testes e instrutor na Qualister. É professor do curso de pós-graduação em Qualidade de Software na Uniasselvi (Blumenau, SC). Trabalhou, entre outros, em projetos de teste em Cloud Computing na UOL, em ferramentas de negociação do mercado de ações (MegaBolsa e E-PUMA) na BM&FBovespa, em projetos de telecomunicações na Vivo via Aitec do Brasil e em softwares de gestão pública no Assessor Público. É grande entusiasta da disciplina de testes de software e práticas ágeis.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Page Reader Press Enter to Read Page Content Out Loud Press Enter to Pause or Restart Reading Page Content Out Loud Press Enter to Stop Reading Page Content Out Loud Screen Reader Support