Está en la página 1de 21

Inicio Libros Tutoriales Eventos Foro Buscar

Aprende Symfony2 (Parte 5):


Tests
Este es el quinto artculo de la serie para aprender sobre el framework Symfony2. En los
anteriores artculos desarrollamos una aplicacin sencilla que muestra informacin
sobre empresas y que contiene los siguientes archivos:

.
app
AppKernel.php
cache
.gitkeep
config
config.yml
routing.yml
logs
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
.gitkeep
composer.json
composer.lock
src
AppBundle
Controller
ApiController.php
AppBundle.php
.gitignore
web
app.php

Ejecutar el comando composer install debera crear el directorio vendor/ , que hemos
ignorado en Git. Si lo necesitas, echa un vistazo al repositorio de cdigo pblico en el
que estamos desarrollando la aplicacin. En este artculo crearemos tests funcionales
utilizando PHPUnit.

Instalando PHPUnit
PHPUnit es un framework muy popular para crear tests. Su nombre engaa un poco, ya

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
que no solo sirve para crear test unitarios, sino que puedes crear tambin tests
funcionales, test tipo end to end, etc.

En primer lugar, instalemos PHPUnit en nuestro proyecto:

$ composer require --dev phpunit/phpunit

La opcin --dev evitar que Composer instale PHPUnit cuando ejecutemos composer
install --no-dev . Esto es especialmente til en el entorno de produccin, donde
seguramente no querremos instalar PHPUnit.

Despus necesitamos crear un archivo de configuracin que le diga a PHPUnit que


ejecute los tests que se encuentran en src/AppBundle/Tests , y que use Composer
como autoloader:

<?xml version="1.0" encoding="UTF-8"?>


<!-- File: app/phpunit.xml.dist -->

<!-- http://phpunit.de/manual/current/en/appendixes.configuration.htm
l -->
<phpunit

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
backupGlobals="false"
colors="true"
syntaxCheck="false"
bootstrap="../vendor/autoload.php">

<testsuites>
<testsuite name="Functional Test Suite">
<directory>../src/AppBundle/Tests</directory>
</testsuite>
</testsuites>

</phpunit>

NOTA Una de las convenciones de Symfony dice que los tests deberan seguir la misma estructura
de archivos y directorios que la aplicacin. Por eso los tests deberan crearse en
src/AppBundle/Tests . No es obligatorio, pero si quieres que otra gente encuentre las cosas
donde esperan encontrarlas, es mejor que lo hagas as.

Este archivo lleva el sufijo .dist porque la idea es que cada desarrollador pueda
sobreescribir la configuracin creando un archivo app/phpunit.xml . Slo el archivo
comn de tipo .dist debe ser publicado:

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
$ echo '/app/phpunit.xml' >> .gitignore
$ git add -A
$ git commit -m 'PHPUnit instalado'

Entornos de ejecucin
Para nuestros tests funcionales, utilizaremos la clase WebTestCase , que instancia
nuestro AppKernel con el entorno test . Tambin usa el servicio test.client , que est
desactivado por defecto.

Para activarlo, debemos modificar la configuracin:

# app/config/config.yml
framework:
secret: "El valor de esta opcin debe ser una cadena aleatoria."
router:
resource: %kernel.root_dir%/config/routing.yml

# test: ~

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Normalmente no queremos que nuestra configuracin sea la misma en nuestros tests y
en nuestro servidor de produccin. Para eso estn los entornos. Coloquemos la
configuracin especfica de nuestros tests en un archivo diferente:

# app/config/config_test.yml
imports:
- { resource: config.yml }

framework:
test: ~

NOTA El parmetro imports te permite incluir otros archivos de configuracin. As, puedes
sobreescribir los parmetros includos, o aadir nuevos.

Deberamos cambiar tambin el mtodo registerContainerConfiguration de la clase


AppKernel para que cargue la configuracin de los tests dependiendo del entorno:

<?php
// app/AppKernel.php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
class AppKernel extends Kernel
{
public function registerBundles()
{
return array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new AppBundle\AppBundle(),
);
}

public function registerContainerConfiguration(LoaderInterface $loade


r)
{
$file = 'config';
if ('test' === $this->getEnvironment()) {
$file .= '_test';
}
$loader->load(__DIR__."/config/$file.yml");
}
}
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Hagamos un commit al repositorio:

$ git add -A
$ git commit -m 'Aadida la configuracin de testing'

Tests funcionales
Nuestro test debe comprobar que la aplicacin se comporta como esperamos. No
comprobaremos que realmente ejecuta bien toda la lgica de negocio, por lo que
comprobar el cdigo de estado HTTP es ms que suficiente.

Creemos el directorio:

$ mkdir -p src/AppBundle/Tests/Controller

NOTA En este caso, tambin por convencin, se recomienda que la estructura de directorios de los
tests sea la misma que la del bundle.

Y este es nuestro primer test funcional:


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
<?php
// src/AppBundle/Tests/Controller/ApiControllerTest.php
namespace AppBundle/Tests/Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApiControllerTest extends WebTestCase


{
public function testInformacionSobreEmpresaExistente()
{
$method = 'POST';
$uri = '/api/informacion';
$parameters = array();
$files = array();
$server = array();
$content = json_encode(array(
'empresa' => 'ACME',
));

$client = static::createClient();
$client->request($method, $uri, $parameters, $files, $server, $co
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
ntent);
$response = $client->getResponse();

$this->assertTrue($response->isSuccessful());
}
}

Para comprobar que pasamos el test, ejecuta el siguiente comando:

$ ./vendor/bin/phpunit -c app

Al instalar PHPUnit, Composer cre un archivo binario llamado phpunit en el directorio


vendor/bin . La opcin -c le dice a PHPUnit dnde est su archivo de configuracin (en
el caso de las aplicaciones Symfony, este archivo siempre se encuentra en app/ ).

El cdigo de nuestro test es un poco largo por culpa de los parmetros. Para
simplificarlo podemos utilizar los mtodos auxiliares:

<?php
// src/AppBundle/Tests/Controller/ApiControllerTest.php

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
namespace AppBundle/Tests/Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApiControllerTest extends WebTestCase


{
private function post($uri, array $data)
{
$content = json_encode($data);
$client = static::createClient();
$client->request('POST', $uri, array(), array(), array(), $conten
t);

return $client->getResponse();
}

public function testInformacionSobreEmpresaExistente()


{
$response = $this->post('/api/informacion', array('empresa' => 'A
CME'));

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
$this->assertTrue($response->isSuccessful());
}
}

Ahora comprueba que el test sigue pasando correctamente:

$ ./vendor/bin/phpunit -c app

El mtodo isSuccessful de Response slo comprueba que el cdigo de estado es 2xx.


Aqu est el test para el caso de error:

<?php
// src/AppBundle/Tests/Controller/ApiControllerTest.php

namespace AppBundle/Tests/Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApiControllerTest extends WebTestCase


{
private function post($uri, array $data)

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
{
$content = json_encode($data);
$client = static::createClient();
$client->request('POST', $uri, array(), array(), array(), $conten
t);

return $client->getResponse();
}

public function testInformacionSobreEmpresaExistente()


{
$response = $this->post('/api/informacion', array('empresa' => 'A
CME'));

$this->assertTrue($response->isSuccessful());
}

public function testInformacionSobreEmpresaInexistente()


{
$response = $this->post('/api/informacion', array('empresa' => 'N
O_EXISTE'));
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
$this->assertFalse($response->isSuccessful());
}
}

Ahora ejecuta de nuevo los tests:

$ ./vendor/bin/phpunit -c app

NOTA A partir de ahora, deberas acostumrbarte a ejecutar los tests continuamente. Asegrate de
ejecutarlos siempre que termines un cambio, y de ejecutarlos de nuevo antes de aadir nada al
repositorio.

Tests funcionales de la API Rest


En mi opinin, comprobar que el cdigo de estado es 2xx y no comprobar el contenido
de la respuesta es ms que suficiente para un test funcional.

Al crear una API REST, puede ser til testear con ms precisin el cdigo de estado.
Nuestra aplicacin es una API REST, as que hagmoslo:

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
<?php
// src/AppBundle/Tests/Controller/ApiControllerTest.php

namespace AppBundle/Tests/Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Response;

class ApiControllerTest extends WebTestCase


{
private function post($uri, array $data)
{
$content = json_encode($data);
$client = static::createClient();
$client->request('POST', $uri, array(), array(), array(), $conten
t);

return $client->getResponse();
}

public function testInformacionSobreEmpresaExistente()


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
{
$response = $this->post('/api/informacion', array('empresa' => 'A
CME'));

$this->assertSame(Response::HTTP_OK , $response->getStatusCode())
;
}

public function testInformacionSobreEmpresaInexistente()


{
$response = $this->post('/api/informacion', array('empresa' => 'N
O_EXISTE'));

$this->assertSame(Response::HTTP_UNPROCESSABLE_ENTITY , $response
->getStatusCode());
}
}

Y ahora ejecuta de nuevo los tests:

$ ./vendor/bin/phpunit -c app
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Verde! Es suficiente recompensa como para hacer un commit al repositorio y dar la
jornada por terminada!

$ git add -A
$ git commit -m 'Tests aadidos'

Conclusin
Ejecutar ./vendor/bin/phpunit -c app es ms sencillo que tener que ejecutar
manualmente HTTPie (como en el artculo anterior)!

Escribir tests funcionales es fcil y rpido, lo nico que debes hacer es comprobar si el
cdigo de estado HTTP es correcto (y para una API REST, comprobar con precisin el
cdigo de estado HTTP).

El prximo artculo ser un resumen de esta serie, espero que te haya gustado!

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Sobre el autor
Este artculo fue publicado originalmente por Loc Chardonnet y ha sido traducido con
permiso por Manuel Gmez.

Artculos de la serie Aprende Symfony


Aprende Symfony2 (Parte 1): Composer

Aprende Symfony2 (Parte 2): Aplicacin vaca

Aprende Symfony2 (Parte 3): Bundles

Aprende Symfony2 (Parte 4): Controladores

Aprende Symfony2 (Parte 5): Tests

Aprende Symfony2 (Parte 6): Conclusin

Comentarios
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
0 Comentarios LibrosWeb
1 Acceder

Ordenar por los mejores


Recomendar Compartir

S el primero en comentar...

S el primero en comentar.

TAMBIN EN LIBROSWEB

Creando fcilmente imgenes de relleno para tus Los cdigos de estado de HTTP
prototipos 1 comentario hace un ao
3 comentarios hace un ao Martha Villacis Excelente post. Felicitaciones muy
Miguel Santisteban Interesante este post, bueno.
felicitaciones, te agradezco mucho el que lo hayas
compartido, saludos!

El nuevo elemento de HTML5 para crear imgenes Preparando tus bocetos sin el Lorem Ipsum
responsive 1 comentario hace un ao
2 comentarios hace un ao Higinio Fuentes Gracias!Que bien que lo haya
Rosevelt Barahona eso tendria que ser con media puesto a disposicion. Es una idea muy practica
queries
open in browser en el css.
PRO version Are you a developer? Try out the HTML to PDF API es verdad, el cliente se distrae con el pdfcrowd.com
queries en el css. es verdad, el cliente se distrae con el

Suscrbete d Aade Disqus a tu sitio web Privacidad

Fecha de publicacin
4 de octubre de 2014

ETIQUETAS POPULARES
composer css diseo html javascript php programacin sistemas symfony

SUSCRBETE GRATIS
RSS Todos los tutoriales

RSS Tutoriales de diseo

RSS Tutoriales de programacin


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
3.756
2006-2017 LibrosWeb.es Contacto Novedades Condiciones Privacidad

das online

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com