Pablasso

Unit Tests en PHP con SimpleTest

May 29, 2009

Hacer pruebas automatizadas de tu código siempre es una buena costumbre, en especial cuando te llega el tiempo de tener que refactorizar.

Para este ejemplo vamos a hacer una clase que calcula las áreas de triángulos, rectángulos y cuadrados.

    class Area
    {
    	function triangle($base, $height) {
    		return ($base * $height) / 2;
    	}
    
    	function rectangle($breadth, $height) {
    		return $breadth * $height;
    	}
    
    	function square($side) {
    		return $side * $side;
    	}
    }

Y vamos a utilizar la herramienta SimpleTest para probar que nuestras funciones están trabajando bien. Para empezar a usarlo solo tienes que bajarlo y colocar la carpeta simpletest dentro de tu proyecto o algún directorio global de PHP.

Una vez instalado podemos comenzar a escribir nuestros casos de prueba.

    require_once 'simpletest/autorun.php';
    require_once 'area.php';
    
    class AreaTestCase extends UnitTestCase
    {
    	var $area;
    	
    	function setUp() {
    		$this->area = new Area();
    	}
    	
    	function testTriangle()
    	{
    		$result = $this->area->triangle(6, 10);
    		$this->assertEqual(30, $result);
    	}
    	
    	function testRectangle()
    	{
    		$result = $this->area->rectangle(2, 5);
    		$this->assertEqual(10, $result);
    	}
    	
    	function testSquare()
    	{
    		$result = $this->area->square(4);
    		$this->assertTrue(is_numeric($result));
    	}
    }

El incluir autorun.php nos da la habilidad de poder extender la clase UnitTestCase, permitiéndonos ejecutar las aserciones. Además el autorun.php se encarga de correr las pruebas sin necesidad de que tu tengas que instanciar nada y también es suficientemente inteligente para darte si cuenta si estas en la consola o directamente en el navegador.

La funcion setUp se ejecuta automáticamente antes de correr cualquier prueba. Aquí como todas nuestras pruebas hacen uso de la clase Area, entonces aprovechamos para hacer la instancia una sola vez.

Finalmente SimpleTest corre todas las pruebas que note comienzan con el nombre test y nosotros tenemos 3 de ellas:

  • testTriangle: Prueba que el resultado de la operación sea igual a 30.

  • testRectangle: Prueba que el resultado de la operación sea igual a 10.

  • testSquare: Prueba que el resultado de la operación sea un número.

Cualquier otro resultado nos arrojaría errores. Estas pruebas ejecutadas en el navegador se verían así, pero también puedes ejecutarlas en consola sin ningún problema.

simpletest

SimpleTest tiene muchas opciones más como el agrupar casos de prueba, escribir tus propias aserciones, mockups (simulaciones de escenarios) y pruebas web (aunque limitado). Así que no te dejes de llevar por el nombre no es simple, solo es fácil de usar.


Juan Pablo OrtizWritten by Juan Pablo Ortiz who lives and works in Guadalajara, Mexico. You should follow him on Twitter