Construir software confiable requiere más que escribir código funcional: implica validar cada componente de manera automatizada. Aquí se muestra paso a paso cómo iniciar un proyecto real en PHP utilizando Composer como gestor de dependencias y PHPUnit como framework de pruebas unitarias, aplicando una metodología donde las pruebas guían la creación del código.
¿Cómo instalar PHPUnit con Composer?
El primer paso es instalar PHPUnit a través de Composer. Desde el terminal se ejecuta el comando composer require --dev phpunit/phpunit [00:38]. Este proceso se conecta a Internet, evalúa el componente solicitado y lo instala de forma automática.
Al finalizar la instalación se generan tres elementos fundamentales:
El archivo composer.json con la configuración del proyecto.
La carpeta vendor con las dependencias descargadas.
El archivo composer.lock que registra las versiones exactas instaladas.
Dentro del composer.json es necesario configurar el autoload con PSR-4 [01:35]. Se define el namespaceApp\ apuntando a la carpeta src/. Después de guardar estos cambios, se ejecuta composer dump-autoload para registrar la nueva configuración. También conviene agregar los campos name (por ejemplo proveedor/validacion) y description para evitar advertencias del sistema [02:05].
¿Cómo configurar el archivo PHPUnit.xml?
PHPUnit utiliza un archivo de configuración XML llamado phpunit.xml [02:30]. La estructura base incluye:
El atributo bootstrap indica que se cargue vendor/autoload.php, exactamente lo mismo que se haría en un index.php tradicional [03:12]. El atributo colors en true permite visualizar los resultados con colores distintivos: verde cuando las pruebas pasan y rojo cuando fallan.
El bloque testsuite define el directorio donde se almacenan las clases de prueba. Para ejecutar las pruebas se usa el comando vendor/bin/phpunit desde el terminal [03:55].
¿Cómo escribir pruebas que guíen la creación del código?
La metodología aplicada aquí sigue el principio de escribir primero el test y después el código. Se crea la carpeta test/ y dentro una clase llamada ValidacionTest.php [04:15]. El estándar indica que las clases de prueba deben terminar con la palabra Test, mientras que la clase que se desea probar no la lleva.
php
<?php
use PHPUnit\Framework\TestCase;
use App\Validacion;
class ValidacionTest extends TestCase
{
public function testEmail()
{
$email = Validacion::email("i@remotos.com");
$this->assertTrue($email);
}
}
La clase extiende de **TestCase**, que es la clase base del *framework* PHPUnit [04:32]. Al ejecutar esta prueba sin haber creado la clase `Validacion`, el resultado es **rojo**: la clase no existe [05:20]. Este error es intencional, ya que las pruebas actúan como guía para saber exactamente qué construir.
### ¿Cómo implementar la clase de validación?
Se crea el archivo `src/Validacion.php` con su *namespace* correspondiente [05:40]:
php
<?php
namespace App;
class Validacion
{
public static function email($valor)
{
return (bool) filter_var($valor, FILTER_VALIDATE_EMAIL);
}
}
La función **filter_var** es nativa de PHP y permite filtrar variables según constantes predefinidas [06:15]. En este caso se utiliza `FILTER_VALIDATE_EMAIL` para verificar que el formato del correo electrónico sea válido. El resultado se convierte a **booleano** con `(bool)` para retornar `true` o `false`.
Al ejecutar nuevamente las pruebas, el resultado pasa de rojo a **verde** [06:38].
### ¿Cómo probar casos negativos?
También es posible validar entradas incorrectas. Por ejemplo, un correo con dos arrobas como `i@@remotos.com` debería fallar [06:55]:
php
public function testEmailIncorrecto()
{
$email = Validacion::email("i@@remotos.com");
$this->assertFalse($email);
}
Se utiliza **assertFalse** en lugar de `assertTrue` porque se espera que el valor sea falso. Este tipo de pruebas garantiza que el código **no permita que información errónea pase sin ser detectada**.
Las pruebas automatizadas funcionan como un robot que verifica continuamente que cada componente opera según lo esperado [07:10]. Aplicar estas prácticas desde el inicio acerca los proyectos al mundo laboral, donde el código debe estar preparado y respaldado por *testing* antes de llegar a producción.
¿Ya has implementado pruebas unitarias en tus proyectos? Comparte tu experiencia y las dificultades que has encontrado al trabajar con PHPUnit.
Hola, para las personas que les sale un error tiene que instalar primero xml
sudo apt install php-xml
y luego si ejecutan el comando
composer require --dev phpunit/phpunit
Exitos y Nunca Paren De Aprender
Me has salvado de horas de estar buscando el por que del error. Gracias!
Grande !!
Estoy usando Windos 10 y tuve que utilizar el comando así:
php vendor/phpunit/phpunit/phpunit
Además, tuve que crear el directorio tests de forma manual.
Después obtuve el mensaje: No tests executes; tal como en la clase.
Gracias!!! Me diste la solución!
Gracias por el dato amigo, me faltaba el directorio
Iniciando nuestro proyecto
PHP, Composer, PHPUnit
Comenzando 🚀
Ahora vamos a seguir los siguientes pasos para dar inicio a nuestro proyecto y su configuración inical.
Agregamos phpunit con la consola abierta en la carpeta raiz que usaremos para el proyecto.
Ejecutamos en la consola 📋
composer require --dev phpunit/phpunit
Automátcamente composer crea la carpeta vendor/, y los archivos composer.json y composer.lock
Ahora vamos a configurar el archivo composer.json con el autoload, escribiendo los siguientes datos dentro del archivo composer.json
{"name":"sebasvillegas/validate","description":"Proyecto de validación","autoload":{"psr-4":{"App\\":"src/"}},"require-dev":{"phpunit/phpunit":"^9.5"}}
Instalación 🔧
Creamos el archivo phpunit.xml en la carpeta raíz
touch phpunit.xml
Escribimos en el archivo phpunit.xml la siguiente configuración
Hay que tener en ceunta que debemos crear el directorio que referenciamos en la configuración del archivo anterior tests.
mkdir tests
En la carpeta vamos a crer las calses de prueba que vamos a trabjar o validadr
Creamos la clase con la que vamos a realizar el test con la siguiente estructura de nombre NombreClaseTest.php
test/NombreClaseTest.php
//Crea el archivotouch tests/ValidateTest.php//Abrir con Visual Studio Codecode tests/ValidateTest.php
Ahora vamos a configurar la calse de configuración con el siguiente código
<?php
use PHPUnit\Framework\TestCase;use App\Validate;classValidateTestextendsTestCase{publicfunctiontest_email(){ $email =Validate::email('optimusoft@outlook.com'); $this->assertTrue($email);}}
En este paso creamos la carpeta src/ a la que hace referencia el namespace App
mkdir src
luego creamos el archivo con la clase que vamos a usar, siguiendo la teoría de nombres, en este caso no le agregamos test al final: NombreClase.php.
//Crea el archivotouch src/Validate.php//Abre el archivo con vsCodecode src/Validate.php
_Escrivimos la clase con sus funciones como se muestra a continuación, retornando un boolean como validación o resultado del test. La función creada debe ser static function _
Finalmente ejecutamos la prueba en la consola con el siguiente comando
vendor/phpunit/phpunit/phpunit
Ejecutando las pruebas ⚙️
El comando anterior ejecutará la prueba y nos lanzará el mensaje de validación o error correspondeinte. Se sugiere por buenas practicas ejecutar la validación antes de crear la calse, y durante la creación de la calse, así nos aseguramos de reconocer el valor negativo o de error. Nos debe aparecer algo similar a lo que se muestra acá:
Error:Call to undefined method App\Validate::email()C:\xampp\htdocs\prueba\tests\ValidateTest.php:10ERRORS!Tests:1,Assertions:0,Errors:1.
Este sería el resultado al ejecutar el comando cuando la función se sncuentré creada correctamente
Gracias a Italo Morales, al Team Platzi y a todos los que participaron en la creación de los cursos🤓.
Muchas gracias!!!
Que grande eres bro!
DATO IMPORTANTE1-Para los que se hayan olvidado del curso previo a este (fundamentos de PHP) hay que iniciar el archivo de autoload con composer dump por eso sale un error en la consola a algunos.
2-Para los que estén en windows ejecuten php vendor/phpunit/phpunit/phpunit y funcionará
Adjunto una imagen del error en el punto 1:
 me aparrecia ese error y no entendia el porqué, ya lo solucioné gracias a tu consejo ;)
Gracias bro, habia olvidado el punto 1.
Soy el único que se siente así? En el curso anterior, una de las preguntas era si "el asterisco era un operador aritmético" y ahora usan funciones anidadas en clases que dependen un paquete descargado con un framework. Entiendo el código (excepto los ::), pero no sé para que sirve PHPunit, nunca lo explicaron en la ruta todavía.
En programación, una prueba unitaria es una forma de comprobar el correcto funcionamiento de una unidad de código. Por ejemplo en diseño estructurado o en diseño funcional una función o un procedimiento, en diseño orientado a objetos una clase. Más info por aquí.
PHPUnit sirve para hacer esas pruebas de manera segura. Saludos!
He podido realizar lo que dice la clase, pero no entendí nada de lo que hice, se hace uso de muchas cosas que no se han enseñado ni en el anterior curso ni en este y lo peor es que me funciona pero no sé por qué ni para qué.
Hola ArudoPE,
Primero que nada felicidades, no cualquiera logra desarrollar un proyecto sin saber cómo por qué ni para qué... Mi consejo es que identifiques qué elementos no estás comprendiendo para así saber qué preguntar y saber con claridad qué temas debes reforzar. No veo otra solución.
Saludos
Gracias por responder, voy por partes:
Hace uso de clases cuando no ha enseñado POO aún.
No tengo idea de qué es esto, si es igual a include o es distinto:
use PHPUnit\Framework\TestCase;use App\Validate;
No sé qué es (y ni si quiera explica): Validate:: (¿por qué usa ::?), ni $this, ni ->, ni peor aún AssertFalse, como se ve en este código:
Te lo digo de todo corazón, parece que este curso está hecho para personas que SABEN PHP y quieren aprenderlo de manera correcta, para alguien que nunca había visto PHP (como yo), es un calvario, porque el profesor asume que sabemos muchas cosas que ni se molesta en explicar, y es molesto tener que buscar fuentes en documentación o Youtube o Google por cosas que no explican en clase asumiendo que el alumno sabe.
Disculpen que tire hate pero, en esta clase se hacen muchisimas cosas que no hemos visto ni del lenguaje ni de PHP
aparte ni si quiera explica porque las usa ni para que sirve....
tache..
Hola 👋🏼
Tal vez te puede servir comenzar por el curso básico de php
es frustrante ver que el profesor supone que a todos les funciona a la primera y no da ninguna idea de como solucionar los posibles problemas que se puedan encontrar con tanta configuración.
Finalmente a pesar de leer todas las ayudas que los demàs dejan no pude hacer correr lo necesario. Asì que dejo el curso hasta aquí, una pena.
Siempre es muy útil realizar test, ya lo he comentado antes pero no está de más recordar que el programar usando tests te ayuda a evitarte dolores de cabeza buscando el error
Ayuda master, echamos un resumen de que ta haciendo el teacher.
Gracias por las notas, me sirvieron para comparar mi código.
Al principio no me funcionaba el comando: vendor/phpunit/phpunit/phpunit.
Por lo tanto decidi primero abrir mi terminal de ubuntu en windows
y ejecutar los siguientes comandos
sudo apt-get update
sudo apt-get install php-xml
Lo anterior para instalar php-xml.
Luego dirigirme al editor Code y comenzar a ejecutar los comandos del profesor.
composer require --dev phpunit/phpunit
luego
composer dump
Luego
php vendor/phpunit/phpunit/phpunit
Finalment, todo fue resuelto.
Aun tengo ese error, no me deja abrir la carpeta me dice: Could not open input file.
En el curso de Introducción a Laravel el maestro hace un gran proyecto con Testing, orientado a una API.
este curso deberia ir después del curso de PHP orientada a objetos
Iniciando nuestro proyecto
Utilizaremos composer y phpunit
Lo primero que hacemos es requerir phpunit para el desarrollo
composer require --dev phpunit/phpunit
Luego de eso, modificamos el archivo composer.json y le agregamos un nombre, despcripcion y configuramos el autoload
{"name":"matias-ed/validate","description":"proyecto de validacion","autoload":{"psr-4":{"App\\":"src/"}},"require-dev":{"phpunit/phpunit":"^9.5"}}
Creamos el archivo phpunit.xml donde especificamos en que carpeta se encuentran nuestros tests
Creamos la carpeta tests y dentro de ella creamos el archivo ValidateTest.phpobs: Es buena practica que los archivos de testing terminen en Test
<?php
use PHPUnit\Framework\TestCase; use App\Validate;classValidateTestextendsTestCase//TestCase es una clase de PHPUnit{publicfunctiontest_email(){ $email =Validate::email("matdj31@gmail.com");//aqui llamamos al metodo email de la clase Validate que aun no hemos creado $this->assertTrue($email);//Es un metodo de TestCase}}
Por ultimo creamos nuestra carpeta src/ y adentro creamos nuestra clase Validate
namespace App;classValidate{publicstaticfunctionemail($value){return(bool)filter_var($value,FILTER_VALIDATE_EMAIL);}}//filter_var es una funcion propia de php que me permite filtrar a mis variables//FILTER_VALIDATE_EMAIL es una constante propia de PHP
No me funcionaba hasta que hice:
-renombrar carpeta tests por test
-ejecutar composer dump
-ejecutar php vendor/phpunit/phpunit/phpunit
Me perdí
En que parte específicamente te perdiste compañero? también hay una sección de preguntas, ahi te apoyaremos
Si alguien con mac tiene el error de
No tests executed!
y tiene OSX Big Sur. Esto es debido a un problema con lo que devuelve la version de php que viene pre-instalada en mac ya que se agrego un texto mencionando que php sera eliminado en el futuro pero el mensaje esta concatenado a la version de php
php --version 7.3.22-(to be removed in future macOS)
y phpunit no reconoce la version al tener la cadena de caracteres “-(to be removed in future macOS)” en lugar de solo 7.3.22
La solución es instalar otra version de php usando el manejador de paquetes de mac Homebrew y actualizar el PATH.