Probando

Debido a que Silex está construido en la cima de Symfony2, es muy fácil escribir pruebas funcionales para tu aplicación. Las pruebas funcionales son pruebas automatizadas de software que garantizan que el código funciona correctamente. Estas van a través de la interfaz de usuario, utilizando un navegador simulado, e imitan las acciones que un usuario podría llevar a cabo.

¿Por qué?

Si no estás familiarizado con las pruebas de software, puedes preguntarte por qué tendrías que necesitarlas. Cada vez que haces un cambio a tu aplicación, tienes que probarlo. Esto significa recorrer todas las páginas y asegurarte de que todavía están trabajando. Las pruebas funcionales te ahorran un montón de tiempo, ya que te permiten probar la aplicación en general, en menos de un segundo ejecutando una única orden.

Para más información sobre las pruebas funcionales, pruebas unitarias y pruebas automatizadas de software en general, consulta PHPUnit y Bulat Shakirzyanov hablando en código limpio.

PHPUnit

PHPUnit Es la plataforma de pruebas estándar de facto para PHP. Fue construida para escribir pruebas unitarias, pero también la puedes utilizar para pruebas funcionales. Escribes tus pruebas creando una nueva clase, que extiende a PHPUnit_Framework_TestCase. Tus casos de prueba son los métodos prefijados con test:

class ContactFormTest extends PHPUnit_Framework_TestCase
{
    public function testInitialPage()
    {
        ...
    }
}

En tus casos de prueba, haces afirmaciones sobre el estado de lo que estás probando. En este caso estamos probando un formulario de contacto, por lo tanto se quiere acertar que la página se ha cargado correctamente y contiene nuestro formulario:

public function testInitialPage()
{
    $statusCode = ...
    $pageContent = ...

    $this->assertEquals(200, $statusCode);
    $this->assertContains('Contact us', $pageContent);
    $this->assertContains('<form', $pageContent);
}

Aquí puedes ver algunas de las aserciones disponibles. Hay una lista completa en la sección Escribiendo pruebas para PHPUnit de la documentación de PHPUnit.

WebTestCase

Symfony2 proporciona una clase WebTestCase que puedes utilizar para escribir pruebas funcionales. La versión Silex de esta clase es Silex\WebTestCase, y la puedes utilizar haciendo que tu prueba la extienda:

use Silex\WebTestCase;

class ContactFormTest extends WebTestCase
{
    ...
}

Nota

Para hacer comprobable tu aplicación, es necesario asegurarte de que sigues las instrucciones de “reutilización de aplicaciones” de Usándola.

Para tu WebTestCase, tendrás que implementar un método createApplication, el cual devuelve tu aplicación. Este, probablemente, se verá así:

public function createApplication()
{
    return require __DIR__.'/path/to/app.php';
}

Asegúrate de no usar require_once aquí, ya que este método se ejecutará antes de cada prueba.

Truco

De manera predeterminada, la aplicación se comporta de la misma manera que cuando se utiliza desde un navegador. Pero cuando se produce un error, a veces es más fácil obtener excepciones en lugar de páginas HTML. Es bastante simple si ajustas la configuración de la aplicación en el método createApplication() como sigue:

public function createApplication()
{
    $app = require __DIR__.'/path/to/app.php';
    $app['debug'] = true;
    $app['exception_handler']->disable();

    return $app;
}

Truco

Si tu aplicación usa sesiones, ajusta session.test a true para simular sesiones:

public function createApplication()
{
    // ...

    $this->app['session.test'] = true;

    // ...
}

El WebTestCase proporciona un método createClient. Un cliente actúa como un navegador, y te permite interactuar con tu aplicación. Así es como funciona:

public function testInitialPage()
{
    $client = $this->createClient();
    $crawler = $client->request('GET', '/');

    $this->assertTrue($client->getResponse()->isOk());
    $this->assertCount(1, $crawler->filter('h1:contains("Contact us")'));
    $this->assertCount(1, $crawler->filter('form'));
    ...
}

Aquí suceden varias cosas. Tienes tanto un Cliente como un Rastreador.

También puedes acceder a la aplicación a través de $this->app.

Cliente

El cliente representa un navegador. Este mantiene tu historial de navegación, galletas y mucho más. El método request te permite hacer una petición a una página en tu aplicación.

Nota

Puedes encontrar alguna documentación para esto en la sección cliente del capítulo de pruebas de la documentación de Symfony2.

Rastreador

El rastreador te permite inspeccionar el contenido de una página. Lo puedes filtrar usando expresiones CSS y mucho más.

Nota

Puedes encontrar alguna documentación para este en la sección rastreador del capítulo de pruebas de la documentación de Symfony2.

Configurando

La forma sugerida para configurar PHPUnit es crear un archivo phpunit.xml.dist, un directorio tests y tus pruebas en tests/TuAp/Tests/TuPruebaTest.php. El archivo phpunit.xml.dist debe tener el siguiente aspecto:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
>
    <testsuites>
        <testsuite name="Batería de pruebas de TuAp">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

También puedes configurar un archivo de arranque para cargar tus clases y listas blancas automáticamente para los informes de cobertura de código.

Tu tests/YourApp/Tests/YourTest.php debería tener este aspecto:

namespace YourApp\Tests;

use Silex\WebTestCase;

class YourTest extends WebTestCase
{
    public function createApplication()
    {
        return require __DIR__.'/../../../app.php';
    }

    public function testFooBar()
    {
        ...
    }
}

Ahora, cuando ejecutes phpunit en la línea de ordenes, se deben ejecutar tus pruebas.

Bifúrcame en GitHub