Nette Documentation Preview

syntax
Primeros pasos con Tester
*************************

<div class=perex>

Incluso los buenos programadores cometen errores. La diferencia entre un buen programador y uno malo es que el bueno lo hará una sola vez y la próxima vez lo detectará usando pruebas automatizadas.

- "Quien no prueba está condenado a repetir sus propios errores". (sabio proverbio)
- "Cuando nos libramos de un error, aparece otro". (Ley de Murphy)
- "Siempre que tengas la tentación de imprimir una declaración, escríbela en su lugar como una prueba". (Martin Fowler)

</div>

¿Has escrito alguna vez el siguiente código en PHP?

```php
$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);
```

¿Has volcado alguna vez el resultado de la llamada a una función sólo para comprobar a ojo que devuelve lo que debe devolver? Seguro que lo haces muchas veces al día. Con la mano en el corazón, si todo funciona, ¿borras este código y esperas que la clase no se rompa en el futuro? La Ley de Murphy garantiza lo contrario :-)

De hecho, tú escribiste la prueba. Necesita una ligera modificación para no requerir nuestra inspección, simplemente para poder comprobarse a sí mismo. Y si no lo borraste podríamos ejecutarlo en cualquier momento en el futuro para verificar que todo sigue funcionando como debería. Es posible que crees una gran cantidad de estas pruebas a lo largo del tiempo, por lo que estaría bien que pudiéramos ejecutarlas automáticamente.

Y Nette Tester ayuda precisamente con eso.


¿Qué hace que Tester sea único? .[#toc-what-makes-tester-unique]
================================================================

Escribir pruebas para Nette Tester es único en el sentido de que **cada prueba es un script PHP estándar que puede ejecutarse de forma autónoma.**

Así que cuando usted escribe una prueba, puede simplemente ejecutarla para ver si hay un error de programación. Si funciona correctamente. Si no, puedes recorrer fácilmente el programa en tu IDE y buscar un error. Incluso puedes abrirlo en un navegador.

Y lo más importante - ejecutándolo, realizarás la prueba. Usted sabrá inmediatamente si pasó o falló. ¿Cómo? Vamos a mostrar aquí. Vamos a escribir una prueba trivial para el uso de PHP matriz y guardarlo en el archivo `ArrayTest.php`:

```php .{file:ArrayTest.php}
<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php'; # cargar Composer autoloader
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);          # verifica que $stack contiene el elemento 'foo'
```

Como puedes ver, los [métodos de aserción |Assertions] como `Assert::same()` se utilizan para afirmar que un valor real coincide con un valor esperado.

La prueba está escrita, podemos ejecutarla desde la línea de comandos. La primera ejecución revelará cualquier error de sintaxis, y si no cometió un error tipográfico, verá:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color:#FFF; background-color:#090">OK</span>
\--

Prueba a cambiar la sentencia a `Assert::contains('XXX', $stack);` en la prueba y observa lo que ocurre al ejecutarla:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color: #FFF">Failed: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> should contain </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">in </span><span style="color: #FFF">ArrayTest.php(17)</span><span style="color: #808080"> Assert::contains('XXX', $stack);</span>

<span style="color: #FFF; background-color: #900">FAILURE</span>
\--

Continuamos sobre la escritura en el capítulo [Escribiendo Pruebas |Writing Tests].


Instalación y requisitos .[#toc-installation-and-requirements]
==============================================================

La versión mínima de PHP requerida por Tester es la 7.1 (para más detalles, consulte la tabla de [versiones de PHP soportadas |#supported PHP versions] ). La forma preferida de instalación es por [Composer |best-practices:composer]:

/--pre .[terminal]
composer require --dev nette/tester
\--

Intente ejecutar Nette Tester desde la línea de comandos (sin argumentos sólo mostrará un resumen de ayuda):

/--pre .[terminal]
vendor/bin/tester
\--


Ejecutar pruebas .[#toc-running-tests]
======================================

A medida que nuestra aplicación crece, el número de pruebas crece con ella. No sería práctico ejecutar las pruebas una a una. Por ello, el Comprobador dispone de un ejecutor de pruebas masivo, que invocamos desde la línea de comandos. El parámetro es el directorio en el que se encuentran las pruebas. El punto indica el directorio actual.

/--pre .[terminal]
vendor/bin/tester .
\--

El ejecutor de Nette Tester busca en el directorio especificado y en todos los subdirectorios y busca las pruebas, que son los archivos `*.phpt` y `*Test.php`. También encontrará nuestra prueba `ArrayTest.php`, ya que coincide con la máscara.

A continuación, inicia las pruebas. Ejecuta cada prueba como un nuevo proceso PHP, por lo que se ejecuta completamente aislado de los demás. Se ejecuta en paralelo en múltiples hilos, por lo que es extremadamente rápido. Y primero ejecuta las pruebas que fallaron durante la ejecución anterior, por lo que sabrá de inmediato si solucionó el error.

Por cada prueba realizada, el ejecutor imprime un carácter para indicar el progreso:

- <code style="color: #CCC; background-color: #000">.</code> - prueba superada
- <code style="color: #CCC; background-color: #000">s</code> - prueba omitida
- <code style="color: #FFF; background-color: #900">F</code> - prueba fallida

La salida puede tener este aspecto:

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s................<span style="color: #FFF; background-color: #900">F</span>.........

<span style="color: #F00">-- FAILED: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Failed: </span><span style="color: #FF0">'Hello John'</span><span style="color: #FFF"> should be</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Hello Peter'</span>

<span style="color: #CCC">   in </span><span style="color: #FFF">greeting.phpt(19)</span><span style="color: #808080"> Assert::same('Hello Peter', $o->say('John'));</span>

<span style="color: #FFF; background-color: #900">FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)</span>
\--

Se ejecutaron 35 pruebas, una falló, una se omitió.

Continuamos en el capítulo [Ejecución de pruebas |Running tests].


Modo vigilancia .[#toc-watch-mode]
==================================

¿Está refactorizando el código? ¿O incluso desarrollas según la metodología TDD (Test Driven Development)? Entonces te gustará el modo vigilancia. El Probador monitoriza los códigos fuente y se ejecuta a sí mismo cuando se producen cambios.

Durante el desarrollo, tienes un terminal en la esquina del monitor, donde se te ilumina la barra de estado verde, y cuando de repente se vuelve roja, sabes que acabas de hacer algo no deseado. En realidad es un gran juego en el que programas e intentas ceñirte al color.

El modo Watch se inicia usando el parámetro [--watch |running-tests#w-watch-path].


Informes de CodeCoverage .[#toc-codecoverage-reports]
=====================================================

El Comprobador puede generar informes con una visión general de cuánto código fuente cubren las pruebas. El informe puede estar en formato HTML legible por humanos o en Clover XML para su posterior procesamiento automático.

Vea el "ejemplo de informe HTML":https://files.nette.org/tester/coverage.html con cobertura de código.


Versiones de PHP soportadas .[#toc-supported-php-versions]
==========================================================

| versión | compatible con PHP
|------------------|-------------------
| Tester 2.5       | PHP 8.0 – 8.3
| 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

Se aplica a las últimas versiones de parches.

Hasta la versión 1.7 Tester soportaba [HHVM |https://hhvm.com] 3.3.0 o superior (usando `tester -p hhvm`). El soporte ha sido eliminado desde Tester 2.0. El uso era simple:

Primeros pasos con Tester

Incluso los buenos programadores cometen errores. La diferencia entre un buen programador y uno malo es que el bueno lo hará una sola vez y la próxima vez lo detectará usando pruebas automatizadas.

  • „Quien no prueba está condenado a repetir sus propios errores“. (sabio proverbio)
  • „Cuando nos libramos de un error, aparece otro“. (Ley de Murphy)
  • „Siempre que tengas la tentación de imprimir una declaración, escríbela en su lugar como una prueba“. (Martin Fowler)

¿Has escrito alguna vez el siguiente código en PHP?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

¿Has volcado alguna vez el resultado de la llamada a una función sólo para comprobar a ojo que devuelve lo que debe devolver? Seguro que lo haces muchas veces al día. Con la mano en el corazón, si todo funciona, ¿borras este código y esperas que la clase no se rompa en el futuro? La Ley de Murphy garantiza lo contrario :-)

De hecho, tú escribiste la prueba. Necesita una ligera modificación para no requerir nuestra inspección, simplemente para poder comprobarse a sí mismo. Y si no lo borraste podríamos ejecutarlo en cualquier momento en el futuro para verificar que todo sigue funcionando como debería. Es posible que crees una gran cantidad de estas pruebas a lo largo del tiempo, por lo que estaría bien que pudiéramos ejecutarlas automáticamente.

Y Nette Tester ayuda precisamente con eso.

¿Qué hace que Tester sea único?

Escribir pruebas para Nette Tester es único en el sentido de que cada prueba es un script PHP estándar que puede ejecutarse de forma autónoma.

Así que cuando usted escribe una prueba, puede simplemente ejecutarla para ver si hay un error de programación. Si funciona correctamente. Si no, puedes recorrer fácilmente el programa en tu IDE y buscar un error. Incluso puedes abrirlo en un navegador.

Y lo más importante – ejecutándolo, realizarás la prueba. Usted sabrá inmediatamente si pasó o falló. ¿Cómo? Vamos a mostrar aquí. Vamos a escribir una prueba trivial para el uso de PHP matriz y guardarlo en el archivo ArrayTest.php:

<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php'; # cargar Composer autoloader
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);          # verifica que $stack contiene el elemento 'foo'

Como puedes ver, los métodos de aserción como Assert::same() se utilizan para afirmar que un valor real coincide con un valor esperado.

La prueba está escrita, podemos ejecutarla desde la línea de comandos. La primera ejecución revelará cualquier error de sintaxis, y si no cometió un error tipográfico, verá:

$ php ArrayTest.php

OK

Prueba a cambiar la sentencia a Assert::contains('XXX', $stack); en la prueba y observa lo que ocurre al ejecutarla:

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Continuamos sobre la escritura en el capítulo Escribiendo Pruebas.

Instalación y requisitos

La versión mínima de PHP requerida por Tester es la 7.1 (para más detalles, consulte la tabla de versiones de PHP soportadas ). La forma preferida de instalación es por Composer:

composer require --dev nette/tester

Intente ejecutar Nette Tester desde la línea de comandos (sin argumentos sólo mostrará un resumen de ayuda):

vendor/bin/tester

Ejecutar pruebas

A medida que nuestra aplicación crece, el número de pruebas crece con ella. No sería práctico ejecutar las pruebas una a una. Por ello, el Comprobador dispone de un ejecutor de pruebas masivo, que invocamos desde la línea de comandos. El parámetro es el directorio en el que se encuentran las pruebas. El punto indica el directorio actual.

vendor/bin/tester .

El ejecutor de Nette Tester busca en el directorio especificado y en todos los subdirectorios y busca las pruebas, que son los archivos *.phpt y *Test.php. También encontrará nuestra prueba ArrayTest.php, ya que coincide con la máscara.

A continuación, inicia las pruebas. Ejecuta cada prueba como un nuevo proceso PHP, por lo que se ejecuta completamente aislado de los demás. Se ejecuta en paralelo en múltiples hilos, por lo que es extremadamente rápido. Y primero ejecuta las pruebas que fallaron durante la ejecución anterior, por lo que sabrá de inmediato si solucionó el error.

Por cada prueba realizada, el ejecutor imprime un carácter para indicar el progreso:

  • . – prueba superada
  • s – prueba omitida
  • F – prueba fallida

La salida puede tener este aspecto:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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 se omitió.

Continuamos en el capítulo Ejecución de pruebas.

Modo vigilancia

¿Está refactorizando el código? ¿O incluso desarrollas según la metodología TDD (Test Driven Development)? Entonces te gustará el modo vigilancia. El Probador monitoriza los códigos fuente y se ejecuta a sí mismo cuando se producen cambios.

Durante el desarrollo, tienes un terminal en la esquina del monitor, donde se te ilumina la barra de estado verde, y cuando de repente se vuelve roja, sabes que acabas de hacer algo no deseado. En realidad es un gran juego en el que programas e intentas ceñirte al color.

El modo Watch se inicia usando el parámetro –watch.

Informes de CodeCoverage

El Comprobador puede generar informes con una visión general de cuánto código fuente cubren las pruebas. El informe puede estar en formato HTML legible por humanos o en Clover XML para su posterior procesamiento automático.

Vea el ejemplo de informe HTML con cobertura de código.

Versiones de PHP soportadas

versión compatible con PHP
Tester 2.5 PHP 8.0 – 8.3
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

Se aplica a las últimas versiones de parches.

Hasta la versión 1.7 Tester soportaba HHVM 3.3.0 o superior (usando tester -p hhvm). El soporte ha sido eliminado desde Tester 2.0. El uso era simple: