Zend Framework - Teste de Unidade

Em geral, podemos depurar um aplicativo PHP usando o advanced debugger tool ou usando comandos simples como echo e die. Em um cenário da web, precisamos testar a lógica de negócios, bem como a camada de apresentação. Os formulários em um aplicativo da web podem ser testados inserindo dados de teste relevantes para garantir que os formulários estejam funcionando conforme o esperado.

O design de um site pode ser testado manualmente usando um navegador. Esse tipo de processo de teste pode ser automatizado usando teste de unidade. Um teste de unidade é essencial em grandes projetos. Esses testes de unidade ajudarão a automatizar o processo de teste e alertar o desenvolvedor quando algo der errado.

Configurando o PHPUnit

O framework Zend se integra com o framework de teste de unidade PHPUnit. Para escrever um teste de unidade para o framework Zend, precisamos configurar o PHPUnit, o que pode ser feito facilmente usando o seguinte comando Composer.

$ composer require --dev phpunit/phpunit

Depois de executar o comando acima, você obterá uma resposta conforme mostrado no seguinte bloco de código.

Using version ^5.7 for phpunit/phpunit 
./composer.json has been updated 
Loading composer repositories with package information 
Updating dependencies (including require-dev) 
Nothing to install or update 
Writing lock file 
Generating autoload files

Agora, ao abrir o arquivo “composer.json”, você verá as seguintes alterações -

"require-dev": { 
   "phpunit/phpunit": "^5.7" 
}

TestCase e Assertions

O framework Zend fornece classes auxiliares para testar a unidade do controlador. oTestCase é o principal componente em um PHPUnit framework para escrever os casos de teste e o Zend Framework fornece uma implementação abstrata do TestCase que é chamado de AbstractHttpControllerTestCase.

Este AbstractHttpControllerTestCase fornece vários Assertmétodos e podem agrupados por funcionalidade. Eles são os seguintes -

  • Request Assertions- Usado para declarar a solicitação http. Por exemplo, assertControllerName.

  • CSS Select Assertions - Usado para verificar o HTML de resposta usando o modelo HTML DOM.

  • XPath Assertions - Uma alternativa às asserções de seleção CSS com base no XPath.

  • Redirect Assertions - Usado para verificar o redirecionamento da página.

  • Response Header Assertions - Usado para verificar o cabeçalho de resposta como código de status (assertResponseStatusCode)

Criar diretório de testes

Um teste de unidade pode ser escrito separadamente para cada módulo. Toda a codificação relacionada ao teste precisa ser criada dentro dotest pasta sob o diretório raiz do módulo.

Por exemplo, para escrever um teste para o TutorialController disponível no módulo Tutorial, a classe de teste precisa ser colocada no diretório myapp / module / Tutorial / test / Controller /.

Exemplo

Vamos escrever uma classe de teste para testar a unidade TutorialController.

Para começar, devemos escrever uma classe chamada TutorialControllerTest e estendê-la para AbstractHttpControllerTestCase.

A próxima etapa é escrever um Setupmétodo para configurar o ambiente de teste. Isso pode ser feito chamando osetApplicationConfig método e passando nosso arquivo de configuração do aplicativo principal myapp / config / application.config.php

public function setUp() { 
   $configOverrides = [];  
   $this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides 
   )); 
   parent::setUp(); 
}

Escreva um ou mais métodos e chame vários métodos de declaração dependendo do requisito.

$this->assertMatchedRouteName('tutorial');

Escrevemos a classe de teste e a lista completa é a seguinte -

<?php  
namespace TutorialTest\Controller;  
use Tutorial\Controller\TutorialController; 
use Zend\Stdlib\ArrayUtils; 
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;  

class TutorialControllerTest extends AbstractHttpControllerTestCase { 
   public function setUp() { 
      $configOverrides = [];  
      $this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides 
      ));  
      parent::setUp(); 
   }  
   public function testIndexActionCanBeAccessed() { 
      $this->dispatch('/tutorial', 'GET'); $this->assertResponseStatusCode(200); 
      $this->assertModuleName('tutorial'); $this->assertControllerName(TutorialController::class); 
      $this->assertControllerClass('TutorialController'); $this->assertMatchedRouteName('tutorial'); 
   } 
}

Agora, abra um prompt de comando, vá para o diretório raiz do aplicativo e execute o phpunit executável disponível dentro do vendor pasta.

cd /path/to/app  
./vendor/bin/phpunit ./vendor/bin/phpunit module/
   Tutorial/test/Controller/TutorialControllerTest.php

O resultado será como mostrado no seguinte bloco de código -

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.  
.1 / 1 (100%)  
Time: 96 ms, Memory: 8.00MB  
OK (1 test, 5 assertions)