Como criar um arquivo .PHPT e executar o teste usando a ferramenta herdphp phpqa (docker) - PHPTestFestBrasil/phptestfestbrasil.github.io GitHub Wiki

How To PHPT

Primeiramente, vamos 'criar' o ambiente para desenvolver.

  • Clonar esse repositório

git clone https://github.com/herdphp/docker-phpqa.git

  • Entrar no folder criado ou especificado por você

cd docker-phpqa

  • Crie um novo folder para você desenvolver os testes em PHPT

mkdir phpt/seunome

PHPT tem algumas convenções de nome de arquivos (seguir padrão inglês)

  • {function-name}_basic.phpt (Testes para o comportamento padrão de uma função)

  • {function-name}_error_{number}.phpt (Testes para erros da função)

  • {function-name}_variation_{number}.phpt (Testes para o comportamento 'não padrão' de uma função)

  • {ext-name}{number}.phpt (Testes para função de uma extensão)

  • bug{bug-id}.phpt (Testes para bugs reportados)

  • Crie um novo arquivo .PHPT, para esse tutorial vamos escrever um teste para testar o comportamento padrão da função in_array

vim phpt/seunome/in_array_basic.phpt

##Conteúdo do arquivo .phpt Exemplo:

--TEST--
Testing correct usage of in_array
--CREDITS--
Seu Nome <user [at] domain [dot] com>
#phptestfest2017
--FILE--
<?php
$os = array('Mac', 'Windows', 'Linux');

if (in_array('Mac', $os)) {
    echo 'Mac Found';
}

?>
--EXPECT--
Mac Found

--TEST--

O bloco TEST é utilizado para definir a descrição do que o PHPT está validando

--CREDITS--

O bloco CREDITS é utilizado para definir quem é você, seu nome, email e o evento que participou (opicional)

--FILE--

O bloco FILE é aonde você vai desenvolver a lógica do teste, em php puro e simples :D

--EXPECT-- or --EXPECTF--

O bloco EXPECT ou EXPECT é o resultado de saída PHP

EXPECT para o utilização correta

EXPECTF para o utilização incorreta, erro

Agora, vamos rodar!

phpqa phpt/seunome

Saída no Console


=====================================================================
Running selected tests.
PASS Testing correct usage of in_array [/usr/src/phpt/seunome/in_array_basic.phpt]
=====================================================================
Number of tests :    1                 1
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :    0 (  0.0%) (  0.0%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :    1 (100.0%) (100.0%)
---------------------------------------------------------------------
Time taken      :    0 seconds
=====================================================================

Tudo funcionando! Agora vamos testar um caso de erro de função.

Primeiro vamos modificar a 'tag' --EXPECT-- para --EXPECTF--, esse é o nome correto do bloco para validar um erro, e modificar a descrição do bloco --TEST--

  • Crie um novo arquivo .PHPT para validar o erro vim phpt/seunome/in_array_error.phpt

Vamos mudar algo para ocorrer um erro, nesse exemplo mudar a variável $os para algo que não é um array

##Conteúdo do arquivo .phpt

--TEST--
Testing wrong usage of in_array
--CREDITS--
Seu Nome <user [at] domain [dot] com>
#phptestfest2017
--FILE--
<?php
$os = '';

if (in_array('Mac', $os)) {
    echo 'Mac Found';
}

?>
--EXPECTF--
Mac Found
  • Rodar os testes para ver a mensagem de saída

phpqa phpt/seunome

Você deverá ver uma saída parecida com essa


=====================================================================
Running selected tests.
PASS Testing correct usage of in_array [/usr/src/phpt/seunome/in_array_basic.phpt]
FAIL Testing wrong usage of in_array [/usr/src/phpt/seunome/in_array_error.phpt]
=====================================================================
Number of tests :    2                 2
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :    1 ( 50.0%) ( 50.0%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :    1 ( 50.0%) ( 50.0%)
---------------------------------------------------------------------
Time taken      :    0 seconds
=====================================================================

=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
Testing wrong usage of in_array [/usr/src/phpt/seunome/in_array_error.phpt]
=====================================================================

Agora vamos ver os arquivos de log

.EXP

Resultado do bloco --EXPECT-- ou --EXPECTF-- do arquivo .phpt

less phpt/seunome/in_array_error.exp

Mac Found

.OUT

Mensagem de saída do PHP relativa ao código executado

less phpt/seunome/in_array_error.out

Warning: in_array() expects parameter 2 to be array, string given in /usr/src/phpt/seunome/in_array_error.phpt on line 4

.PHP

Conteúdo do bloco --FILE--, é o código PHP que foi executado durante o testetest

less phpt/seunome/in_array_error.phpt

<?php
$os = '';

if (in_array('Mac', $os)) {
    echo 'Mac Found';
}

?>

.SH

Comando utilizado para rodar o teste que a 'suite de testes phpt' utilizou

less phpt/seunome/in_array_error.sh

#!/bin/sh

/usr/src/php/sapi/cli/php  -n -c '/usr/src/php/tmp-php.ini'  -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=32767" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=1" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "memory_limit=128M" -d "log_errors_max_len=0" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "extension_dir=/usr/src/php/modules/" -d "zend_extension=/usr/src/php/modules/opcache.so" -d "session.auto_start=0" -d "zlib.output_compression=Off" -d "mbstring.func_overload=0" -f "/usr/src/phpt/seunome/in_array_error.phpt"  2>&1

logs Úteis :D

Esses arquivos são de grande ajuda na hora de debugar os .phpt e identificar qual deveria ser a mensagem de saída correta e o que é necessário modificar no seu teste.

less phpt/seunome/in_array_error.diff

001+ Warning: in_array() expects parameter 2 to be array, string given in /usr/src/phpt/seunome/in_array_error.phpt on line 4
001- Mac Found

less phpt/seunome/in_array_error.log

---- EXPECTED OUTPUT
Mac Found
---- ACTUAL OUTPUT
Warning: in_array() expects parameter 2 to be array, string given in /usr/src/phpt/seunome/in_array_error.phpt on line 4
---- FAILED

Corrigindo o arquivo .phpt

Nesse exemplo, você precisa alterar o block --EXPECTF-- para

Warning: in_array() expects parameter 2 to be array, string given in /usr/src/phpt/seunome/in_array_error.phpt on line 4

Porém, para que o test rode 'tranquilamente' em todas as versões e facilitar futuras modificações, vamos remover os dados 'estáticos' como números e tipos.

Modificar o texto 'string' para o wildcard '%s', desse modo o teste poderá validar qualquer tipo de variável errada

Warning: in_array() expects parameter 2 to be array, %s given in /usr/src/phpt/seunome/in_array_error.phpt on line 4

Vamos modificar o nome do arquivo e a linha do erro para deixar a mensagem de saída limpa para futuras modificações

Warning: in_array() expects parameter 2 to be array, %s given in %s on line %d

Os wildcards são:

  • %s - string (texto)
  • %d - number (números)
  • %c - single char (um caracter)
  • %w - whitespace (espaço)
  • %i - integer (inteiro)
  • %f - float
  • %x - hexadecimal
  • %e - directory separator (separador de diretórios)

Rode novamente

phpqa phpt/seunome

Se tudo estiver correto, os arquivos de log serão removidos e você terá uma saída parecida com esta


=====================================================================
Running selected tests.
PASS Testing correct usage of in_array [/usr/src/phpt/seunome/in_array_basic.phpt]
PASS Testing wrong usage of in_array [/usr/src/phpt/seunome/in_array_error.phpt]
=====================================================================
Number of tests :    2                 2
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :    0 (  0.0%) (  0.0%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :    2 (100.0%) (100.0%)
---------------------------------------------------------------------
Time taken      :    0 seconds
=====================================================================

Divirta-se criando mais testes!