Empezando con Nette Tester
Incluso los buenos programadores cometen errores. La diferencia entre un buen y un mal programador es que el bueno solo lo comete una vez y la próxima vez lo detecta mediante pruebas automatizadas.
- “Quien no prueba, está condenado a repetir sus errores.” (proverbio)
- “Tan pronto como nos deshacemos de un error, aparece otro.” (Ley de Murphy)
- “Cada vez que tengas la tentación de imprimir una variable en la pantalla, escribe mejor una prueba.” (Martin Fowler)
¿Alguna vez has escrito un código similar en PHP?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Es decir, ¿has impreso el resultado de la llamada a una función solo para verificar visualmente si devuelve lo que debería? Seguramente lo haces muchas veces al día. Seamos sinceros: en caso de que todo funcione correctamente, ¿borras este código? ¿Esperas que la clase no se rompa en el futuro? Las leyes de Murphy garantizan lo contrario :-)
Básicamente, has escrito una prueba. Solo necesitas modificarla ligeramente para que no requiera una inspección visual, sino que se verifique a sí misma. Y si no borras la prueba, puedes ejecutarla en cualquier momento en el futuro y verificar que todo sigue funcionando como debería. Con el tiempo, crearás una gran cantidad de tales pruebas, por lo que sería útil ejecutarlas de forma automatizada.
Y con todo esto te ayudará precisamente Nette Tester.
¿Qué hace único a Tester?
Escribir pruebas para Nette Tester es único porque cada prueba es un script PHP normal que se puede ejecutar de forma independiente.
Por lo tanto, cuando escribes una prueba, puedes ejecutarla fácilmente y averiguar si, por ejemplo, no tiene un error de programación. Si funciona correctamente. Si no, puedes depurarla fácilmente en tu IDE y buscar el error. Incluso puedes abrirla en el navegador.
Y sobre todo, al ejecutarla, realizas la prueba. Inmediatamente descubres si pasó o falló. ¿Cómo? Vamos a mostrarlo.
Escribiremos una prueba trivial del trabajo con un array PHP y la guardaremos en el archivo ArrayTest.php
:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # carga del autoloader de Composer
Tester\Environment::setup(); # inicialización de Nette Tester
$stack = [];
Assert::same(0, count($stack)); # esperamos que count() devuelva cero
$stack[] = 'foo';
Assert::same(1, count($stack)); # esperamos que count() devuelva uno
Assert::contains('foo', $stack); # verificamos que $stack contiene el elemento 'foo'
Como puedes ver, los llamados métodos de aserción como
Assert::same()
se utilizan para confirmar que el valor real corresponde al valor esperado.
Tenemos la prueba escrita y podemos ejecutarla desde la línea de comandos. La primera ejecución nos revelará posibles errores de sintaxis y si no has cometido ningún error tipográfico, se imprimirá:
$ php ArrayTest.php
OK
Intenta cambiar la afirmación en la prueba a una falsa Assert::contains('XXX', $stack);
y observa qué sucede al
ejecutarla:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
Continuamos escribiendo sobre esto en el capítulo Escribiendo pruebas.
Instalación y requisitos
La versión mínima de PHP requerida por Tester es 7.1 (más detalladamente en la tabla podporované verze PHP). La forma preferida de instalación es mediante Composer:
composer require --dev nette/tester
Intenta ejecutar Nette Tester desde la línea de comandos (sin parámetros solo mostrará la ayuda):
vendor/bin/tester
Ejecución de pruebas
A medida que la aplicación crece, el número de pruebas crece con ella. No sería práctico ejecutar las pruebas una por una. Por eso, Tester dispone de un ejecutor masivo de pruebas, que llamamos desde la línea de comandos. Como parámetro indicamos el directorio en el que se encuentran las pruebas. El punto significa el directorio actual.
vendor/bin/tester .
El ejecutor de pruebas buscará en el directorio especificado y en todos los subdirectorios y encontrará las pruebas, que son
los archivos *.phpt
y *Test.php
. Así encontrará también nuestra prueba ArrayTest.php
, ya
que cumple con la máscara.
Luego iniciará las pruebas. Cada prueba se ejecuta como un nuevo proceso PHP, por lo que se ejecuta de forma completamente aislada de las demás. Las ejecuta en paralelo en múltiples hilos y gracias a eso es extremadamente rápido. Y como primero ejecuta las pruebas que fallaron en la ejecución anterior, te enterarás inmediatamente si lograste corregir el error.
Durante la ejecución de las pruebas, Tester imprime continuamente los resultados en el terminal como caracteres:
.
– la prueba pasós
– la prueba fue omitida (skipped)F
– la prueba falló (failed)
La salida puede verse así:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.5.2 Note: No php.ini is used. PHP 8.3.2 (cli) | php -n | 8 threads ........s................F......... -- FAILED: greeting.phpt Failed: 'Hello John' should be ... 'Hello Peter' in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John')); FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)
Se ejecutaron 35 pruebas, una falló, una fue omitida.
Continuamos en el capítulo Ejecución de pruebas.
Modo Watch
¿Estás refactorizando código? ¿O incluso desarrollando según la metodología TDD (Test Driven Development)? Entonces te gustará el modo watch. Tester en él vigila los códigos fuente y al cambiar se ejecuta solo.
Durante el desarrollo, tienes en la esquina del monitor un terminal donde te ilumina una barra de estado verde, y cuando de repente cambia a rojo, sabes que acabas de hacer algo no del todo bien. Es en realidad un juego genial, donde programas e intentas mantener el color.
El modo Watch se inicia con el parámetro –watch.
Informes de CodeCoverage
Tester puede generar informes con un resumen de cuánto código fuente cubren las pruebas. El informe puede estar en formato HTML legible por humanos, o Clover XML para su posterior procesamiento automático.
Echa un vistazo a la muestra de informe HTML con cobertura de código.
Versiones de PHP compatibles
versión | compatible con PHP |
---|---|
Tester 2.5 | PHP 8.0 – 8.3 |
Tester 2.4 | PHP 7.2 – 8.2 |
Tester 2.3 | PHP 7.1 – 8.0 |
Tester 2.1 – 2.2 | PHP 7.1 – 7.3 |
Tester 2.0 | PHP 5.6 – 7.3 |
Tester 1.7 | PHP 5.3 – 7.3 + HHVM 3.3+ |
Tester 1.6 | PHP 5.3 – 7.0 + HHVM |
Tester 1.3 – 1.5 | PHP 5.3 – 5.6 + HHVM |
Tester 0.9 – 1.2 | PHP 5.3 – 5.6 |
Válido para la última versión de parche.
Tester hasta la versión 1.7 también soportaba HHVM 3.3.0 o superior (a través de
tester -p hhvm
). El soporte se interrumpió a partir de la versión 2.0 de Tester.