Cuando los proyectos empiezan a crecer, también crecen los retos del mismo: más funciones, más dependencias, y más riesgo de que algo falle con cada cambio. Es aquí, en este punto, donde las pruebas automatizadas se vuelven esenciales para nuestra aplicación, ayudando a mantener todo bajo control y asegurando que nuestra aplicación sigue funcionando de manera correcta.
Symfony viene acompañado de PHPUnit, una increíble librería de testing que nos permite probar nuestro código de forma fácil e intuitiva.
Primeros pasos con PHPUnit
Antes de comenzar, debemos asegurarnos de que disponemos de PHPUnit. Si no es así, podemos instalarlo mediante Composer:
composer require --dev symfony/test-pack
Una vez se haya instalado, lanzamos el siguiente comando:
php bin/phpunit
Este comando lanzará todos las pruebas de nuestra aplicación. Cada test es una clase de PHP que acaba con la palabra "Test", por ejemplo BookControllerTest
.
Hay diferentes tipos de test en Symfony:
- Pruebas Unitarias, para validar unidades individuales de código (Una clase, por ejemplo) que funcionen de manera aislada.
- Pruebas de Integración, para comprobar cómo interactúan varias clases entre sí.
- Pruebas de Aplicación, para verificar el comportamiento de toda la aplicación.
En este post, nos vamos a centrar en las pruebas unitarias, que son la base del testing. Más adelante, en otros posts, profundizaremos en las pruebas de integración y de aplicación.
Nuestro primer test unitario
Las pruebas unitarias son el primer paso que debemos dar para asegurar que nuestro código funcione correctamente. Con estas pruebas, debemos validar que una parte específica de nuestro código funcione de la manera esperada, sin dependencias externas.
Es una de las partes más importantes del testing, ya que nos ayuda a detectar errores desde las etapas más tempranas del desarrollo de nuestra aplicación, evitando a posteriori que estos problemas crezcan y se conviertan en, bueno... grandes dolores de cabeza 🤯
¿Qué hacen nuestras pruebas unitarias?
En Symfony, nuestras pruebas unitarias se centrarán en:
- Probar una clase o método.
- Simular las dependencias con herramientas como mocks o stubs (de lo cual hablaremos más adelante).
- Verificar el comportamiento esperado usando aserciones.
Escribiendo nuestro test
Supongamos que en nuestra aplicación tenemos una clase Calculadora que tiene funciones básicas como sumas, restas, etc.
namespace App\Service;
class Calculadora
{
public function sumar(int $a, int $b): int
{
return $a + $b;
}
}
Queremos escribir un test para asegurarnos de que el método sumar
funciona correctamente. Para ello creamos un archivo en la carpeta test/Service llamado CalculadoraTest.php:
namespace App\Tests\Service;
use PHPUnit\Framework\TestCase;
use App\Service\Calculadora;
class CalculadoraTest extends TestCase
{
public function testSumar(): void
{
$calculadora = new Calculadora();
$result = $calculadora->sumar(2, 3);
$this->assertEquals(5, $result, 'El método debería sumar correctamente dos números');
}
}
Expliquemos el funcionamiento de este test.
- Extendemos de TestCase, que es la clase base de PHPUnit para escribir pruebas. Nos ofrece herramientas como métodos de aserción (En este caso hemos usado el assertEquals).
- Creamos el método testSumar, que debe empezar con test para que PHPUnit lo reconozca.
- Configuramos la Calculadora y guardamos el resultado.
- Verificamos el resultado con assertEquals, que nos compara el valor esperado, en este caso 5, con el valor real,
$result
. Si los resultados son iguales, la prueba es satisfactoria.
¿Cómo ejecutamos nuestro test?
Para ejecutar nuestro test solo tenemos que llamar al binario de PHPUnit:
./vendor/bin/phpunit
Si el resultado es correcto, veremos un resultado en la consola que nos indica que nuestro método sumar
funciona correctamente.
Siguientes pruebas
En próximos posts, atenderemos las necesidades de ejecutar pruebas con dependencias, ayudándonos de los mocks y stubs. Por ejemplo, si nuestra clase Calculadora dependiera de otro servicio, podríamos simularlo con estas herramientas.
Para más información acerca de los test en Symfony, consultar la documentación oficial.