BIGtheme.net http://bigtheme.net/ecommerce/opencart OpenCart Templates
24/10/2017 - 8:13 AM

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)

Sobre Júlio de Lima

Júlio de Lima
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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *