Web BizarroWeb Bizarro

Suscríbete a nuestro Newsletter

X

Únete a nuestra lista de correos para recibir semanalmente actualizaciones de nuestro contenido.

Pruebas PHP modernas para todos

Pruebas PHP modernas para todos 27.OCT.15

Alvaro José Rios Ch
Fundador WebBizarro

Las pruebas son una parte muy importante en el desarrollo de software, sobretodo si queremos realizar aplicaciones extensas y complejas en las que de un momento a otro podemos terminar cometiendo un error o modificando algo que afecte alguna otra parte de la aplicación.

Si no corremos pruebas automáticas que nos indiquen cuando las cosas van mal puede que no nos demos cuenta del problema hasta que sea demasiado tarde y nadie quiere eso, por eso Codeception es una solución que nos permite crear pruebas automáticas rápidamente y con PHP.

Lo interesante de este framework es que tenemos varios tipos de pruebas que nos facilitan la vida, las primeras son las pruebas de aceptación, estas son excelentes para probar formularios o vínculos en nuestra página, por ejemplo si tenemos un formulario para agragar un libro al sistema podemos hacer algo así.

<?php
    $I = new AcceptanceTester($scenario);
    $I->wantTo('create wiki page');
    $I->amOnPage('/');
    $I->click('Pages');
    $I->click('New');
    $I->see('New Page');
    $I->fillField('title', 'Hobbit');
    $I->fillField('body', 'By Peter Jackson');
    $I->click('Save');
    $I->see('page created'); // notice generated
    $I->see('Hobbit','h1'); // head of page of is our title
    $I->seeInCurrentUrl('pages/hobbit');
    $I->seeInDatabase('pages', array('title' => 'Hobbit'));
?>

Como pueden ver primero se crea un escenario y se dirige a la página principal, se hace click en Pages, luego en New y cuando llegue debería ver algo como que diga “New Page” seguido de esto complete los campos “title” con “Hobbit” y el campo “body” con “By Peter Jackson” y haga click en save, si todo va bien debería ver una notificación que diga “page created” y un titulo h1 con el texto “Hobbit” además tiene que estar en la url “pages/hobbit” y en la base de datos la tabla pages tiene que tener un registro con el titulo “Hobbit”, como pueden ver esto les permite crear pruebas para todos los formularios en la aplicación y pueden ser tan complejos como deseen, además también pueden probar que las validaciones funcionen creando casos donde se espere que la aplicación falle.

Lo bueno de todo esto es que una vez escriben las pruebas tienen un caso de prueba que se repite una y otra vez en las mismas condiciones por lo que no hay espacio para el error humano.

Este tipo de pruebas se pueden ejecutar en el browser usando Selenium Webdriver por ejemplo o como pruebas funcionales en frameworks como Symfony2, Zend Framework y Kohana.

De la misma forma el ApiTester permite hacer pruebas sobre las API que maneje tu aplicación.

<?php
    $I = new ApiTester($scenario);
    $I->wantTo('create a new user by API');
    $I->amHttpAuthenticated('davert','123456');
    $I->haveHttpHeader('Content-Type','application/x-www-form-urlencoded');
    $I->sendPOST('/users', array('name' => 'davert' ));
    $I->seeResponseCodeIs(200);
    $I->seeResponseIsJson();
    $I->seeResponseContainsJson(array('result' => 'ok'));
?>

El comportamiento es muy similar a la anterior por lo que no lo voy a explicar mucho.

Además de todo esto también pueden hacer pruebas sobre el código usando PHPUnit, este tipo de prueba permite descartar pruebas en lo que nuestro código hace porque podemos saber que una página no se comporta como debe pero si no sabemos la razón estamos a medias, por eso las pruebas unitarias nos permiten saber que está fallando.

<?php
use \Codeception\Util\Stub;
class UserTest extends \Codeception\TestCase\Test
{
    public function testUserSave() {
        $user = Stub::make('User');
        $user->setName('davert');
        $this->assertEquals('davert', $user->getName());
        $user->save();
        $this->tester->seeInDatabase('users', array('name' => 'davert'));
    }
}
?>

En este caso vemos que se hace una prueba sobre el modelo user, específicamente el proceso de crear uno nuevo. Primero creamos el usuario y se asignamos un nombre, luego verificamos que el método getName retorne el nombre que acabamos de asignar, luego salvamos y revisamos la base de datos para verificar que la tabla users tenga un registro con el nombre que asignamos.

Como pueden ver es muy simple usar esta herramienta y nos puede aliviar muchos dolores de cabeza y aunque de primera mano parece mucho trabajo crear pruebas para toda una aplicación a la larga terminará ahorrando mucho tiempo y largas madrugadas buscando bugs.