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!