PHP

PHP

Tutorial PHP: Introducción al Testing en PHP

PHP: Importancia de las pruebas automatizadas. Mejora la calidad y fiabilidad del software con pruebas unitarias, integración, funcionales y más con Testing.

Aprende PHP GRATIS y certifícate

Importancia de las pruebas automatizadas

En el desarrollo de software profesional, la calidad y la fiabilidad del código son aspectos fundamentales. Las pruebas automatizadas permiten verificar que las funcionalidades del sistema se comportan según lo esperado, reduciendo la probabilidad de errores y facilitando el mantenimiento del código.

Implementar pruebas automatizadas en los proyectos PHP aporta múltiples beneficios. Primero, agiliza la detección de regresiones cuando se realizan cambios o actualizaciones en la base de código. Esto es esencial en proyectos de gran escala donde las modificaciones pueden tener efectos colaterales no previstos.

Además, las pruebas fomentan un código más modular y estructurado, ya que para ser testeable, el código debe estar adecuadamente organizado. Esto conduce a mejores prácticas de programación y facilita la escalabilidad del proyecto.

Otro aspecto importante es que las pruebas automatizadas mejoran la confianza del equipo en el código que desarrollan. Al contar con una suite de pruebas que validan las funcionalidades clave, los desarrolladores pueden realizar cambios con mayor seguridad, sabiendo que cualquier fallo será detectado de inmediato.

Las pruebas también son una herramienta valiosa para la documentación del código. Las pruebas bien escritas sirven como ejemplos prácticos de cómo se espera que funcione el código, lo cual es útil para nuevos miembros del equipo o para revisiones futuras.

Finalmente, en entornos de integración continua y despliegue continuo (CI/CD), las pruebas automatizadas son indispensables. Permiten automatizar la validación del código en cada cambio, garantizando que solo se despliegue código que cumple con los estándares de calidad establecidos.

Tipos de pruebas (unitarias, de integración, funcionales, etc.)

Las pruebas automatizadas en PHP abarcan distintos tipos de pruebas que se clasifican según su alcance y objetivo. Entender las características específicas de cada tipo es esencial para implementar una estrategia de testing efectiva en proyectos de desarrollo.

Pruebas unitarias

Las pruebas unitarias se centran en verificar el comportamiento de las unidades más pequeñas de código, como funciones o métodos individuales. Estas pruebas aseguran que cada componente aislado produce los resultados esperados para un conjunto determinado de entradas. Al enfocarse en unidades específicas, facilitan la detección temprana de errores y promueven un diseño modular y mantenible.

<?php
// src/Calculadora.php

namespace App;

class Calculadora
{
    public function sumar(int $a, int $b): int
    {
        return $a + $b;
    }
}
<?php
// tests/CalculadoraTest.php

use PHPUnit\Framework\TestCase;
use App\Calculadora;

class CalculadoraTest extends TestCase
{
    public function testSumarDevuelveResultadoCorrecto(): void
    {
        $calc = new Calculadora();
        $resultado = $calc->sumar(2, 3);

        $this->assertEquals(5, $resultado, 'La suma de 2 y 3 debe ser 5');
    }
}
$ vendor/bin/phpunit --testsuite tests

Pruebas de integración

Las pruebas de integración evalúan la interacción entre diferentes módulos o componentes del sistema. Su objetivo es identificar problemas que puedan surgir cuando las unidades individuales funcionan juntas. Estas pruebas son cruciales para garantizar que las interfaces y las dependencias entre componentes estén correctamente implementadas y que la comunicación entre ellos sea fluida.

<?php
// src/Logger.php

namespace App;

class Logger
{
    public function log(string $mensaje): bool
    {
        // Simulación de registro en un archivo o base de datos
        // Retorna true si el registro se realiza con éxito
        return true;
    }
}
<?php
// src/ServicioOperaciones.php

namespace App;

class ServicioOperaciones
{
    private Calculadora $calculadora;
    private Logger $logger;

    public function __construct(Calculadora $calculadora, Logger $logger)
    {
        $this->calculadora = $calculadora;
        $this->logger = $logger;
    }

    public function sumarYRegistrar(int $a, int $b): int
    {
        $resultado = $this->calculadora->sumar($a, $b);
        $this->logger->log("Se ha realizado una suma: {$resultado}");
        return $resultado;
    }
}
<?php
// tests/ServicioOperacionesTest.php

use PHPUnit\Framework\TestCase;
use App\Calculadora;
use App\Logger;
use App\ServicioOperaciones;

class ServicioOperacionesTest extends TestCase
{
    public function testSumarYRegistrar()
    {
        $calc = new Calculadora();
        $logger = new Logger();
        $servicio = new ServicioOperaciones($calc, $logger);

        $resultado = $servicio->sumarYRegistrar(10, 5);

        $this->assertEquals(15, $resultado, 'La suma debería ser 15');
        // Aquí podríamos también verificar efectos secundarios en el Logger
        // Ejemplo: $this->assertTrue($logger->someCheck());
    }
}

Pruebas funcionales

Las pruebas funcionales verifican que el sistema completo cumple con los requisitos funcionales establecidos. Se enfocan en las salidas generadas ante determinadas entradas, sin considerar el funcionamiento interno del sistema. Al simular escenarios de uso reales, estas pruebas aseguran que las funcionalidades clave operan correctamente desde la perspectiva del usuario final.

<?php
// tests/ApiTest.php

use PHPUnit\Framework\TestCase;
use GuzzleHttp\Client;

class ApiTest extends TestCase
{
    public function testRutaSumaDevuelveResultadoCorrecto(): void
    {
        $client = new Client(['base_uri' => 'http://localhost:8000']);

        $response = $client->request('GET', '/sumar/3/4');
        $this->assertEquals(200, $response->getStatusCode());

        $body = json_decode($response->getBody()->getContents(), true);
        $this->assertSame(7, $body['resultado'], 'La suma de 3 y 4 debería ser 7');
    }
}

Pruebas de aceptación

Las pruebas de aceptación determinan si el sistema satisface los criterios de aceptación definidos por los stakeholders o clientes. Estas pruebas suelen involucrar a representantes del cliente y se centran en validar que el software cumple con las necesidades del negocio y está listo para su despliegue en producción.

Feature: Sumar números
  Como usuario quiero poder sumar dos números
  para obtener el resultado correcto en pantalla

  Scenario: Sumar 3 y 4
    Given que accedo a la página "/sumar"
    When introduzco "3" en el campo "numero1"
    And introduzco "4" en el campo "numero2"
    And pulso el botón "Calcular"
    Then veo "7" como resultado

Pruebas de regresión

Las pruebas de regresión se aplican para detectar si las modificaciones recientes en el código han introducido errores en funcionalidades que antes funcionaban correctamente. Automatizar estas pruebas es esencial para mantener la estabilidad del software a lo largo del tiempo, especialmente en proyectos con ciclos de desarrollo continuos.

<?php
public function testSumarConNegativos()
{
    $calc = new Calculadora();
    $resultado = $calc->sumar(-2, 3);

    // Esperamos 1 (3 + (-2) = 1)
    $this->assertEquals(1, $resultado, 'La suma de -2 y 3 debe ser 1');
}

Pruebas de rendimiento

Las pruebas de rendimiento analizan cómo se comporta el sistema bajo diferentes condiciones de carga. Evalúan aspectos como la velocidad de respuesta, la utilización de recursos y la escalabilidad. Estas pruebas ayudan a identificar cuellos de botella y a asegurar que la aplicación puede manejar el tráfico y las demandas esperadas en un entorno de producción.

<?php
// tests/RendimientoTest.php

use PHPUnit\Framework\TestCase;
use App\Calculadora;

class RendimientoTest extends TestCase
{
    public function testSumarMilVecesBajoTiempoLimite(): void
    {
        $calc = new Calculadora();
        $inicio = microtime(true);

        for ($i = 0; $i < 1000; $i++) {
            $calc->sumar(rand(), rand());
        }

        $fin = microtime(true);
        $duracion = $fin - $inicio;

        // Por ejemplo, exigimos que 1000 sumas tarden menos de 0.5 segundos
        $this->assertLessThan(0.5, $duracion, 'La operación tarda demasiado tiempo');
    }
}

Pruebas de seguridad

Las pruebas de seguridad tienen como objetivo identificar vulnerabilidades en el sistema y garantizar la protección de la información sensible. Se centran en aspectos como la autenticación, la autorización y la resistencia a ataques comunes como inyección de código o cross-site scripting (XSS). Estas pruebas son fundamentales para mantener la integridad y la confidencialidad de los datos.

<?php
// tests/SeguridadTest.php

use PHPUnit\Framework\TestCase;
use GuzzleHttp\Client;

class SeguridadTest extends TestCase
{
    public function testInyeccionSQLNoPermitida(): void
    {
        // Suponiendo que tenemos un endpoint "/buscar?query="
        $client = new Client(['base_uri' => 'http://localhost:8000']);

        $injectionString = "' OR '1'='1";
        $response = $client->request('GET', '/buscar?query=' . urlencode($injectionString));

        $this->assertEquals(200, $response->getStatusCode());

        // El contenido de la respuesta no debería mostrar datos "ilimitados",
        // ni errores de SQL
        $body = $response->getBody()->getContents();
        $this->assertStringNotContainsString("syntax error", $body);
        $this->assertStringNotContainsString("All Results", $body);
    }
}

Pruebas de usabilidad

Las pruebas de usabilidad evalúan la facilidad de uso y la experiencia del usuario al interactuar con la aplicación. Aunque no siempre se automatizan, son importantes para garantizar que el producto sea intuitivo y satisfaga las expectativas en términos de navegación y accesibilidad.

<?php
// tests/UsabilidadTest.php

use PHPUnit\Framework\TestCase;
use Symfony\Component\Panther\PantherTestCase; // Requiere la instalación de symfony/panther

class UsabilidadTest extends PantherTestCase
{
    public function testElementosPrincipalesVisibles(): void
    {
        $client = static::createPantherClient();
        $crawler = $client->request('GET', '/');

        // Comprobamos que existe un botón "Iniciar sesión"
        $this->assertCount(
            1,
            $crawler->filter('button#btn-iniciar-sesion'),
            'No se encontró el botón de inicio de sesión'
        );

        // Comprobamos que el menú principal tiene los 3 elementos esperados
        $menuItems = $crawler->filter('nav.main-menu li')->count();
        $this->assertEquals(3, $menuItems, 'El menú principal debería tener 3 elementos');
    }
}

Comprender y aplicar estos distintos tipos de pruebas en los proyectos PHP es fundamental para desarrollar software de alta calidad. Cada tipo aborda diferentes aspectos críticos y, en conjunto, contribuyen a una estrategia de testing robusta y efectiva.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende PHP GRATIS online

Todas las lecciones de PHP

Accede a todas las lecciones de PHP y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Php

PHP

Introducción Y Entorno

Instalación Y Primer Programa De Php

PHP

Introducción Y Entorno

Tipos De Datos, Variables Y Constantes

PHP

Sintaxis

Operadores Y Expresiones

PHP

Sintaxis

Estructuras De Control

PHP

Sintaxis

Funciones Y Llamada De Funciones

PHP

Sintaxis

Cadenas De Texto Y Manipulación

PHP

Sintaxis

Manejo De Números

PHP

Sintaxis

Manejo De Fechas Y Tiempo

PHP

Sintaxis

Manejo De Arrays

PHP

Sintaxis

Introducción A La Poo En Php

PHP

Programación Orientada A Objetos

Clases Y Objetos

PHP

Programación Orientada A Objetos

Constructores Y Destructores

PHP

Programación Orientada A Objetos

Herencia

PHP

Programación Orientada A Objetos

Encapsulación

PHP

Programación Orientada A Objetos

Polimorfismo

PHP

Programación Orientada A Objetos

Interfaces

PHP

Programación Orientada A Objetos

Traits

PHP

Programación Orientada A Objetos

Namespaces

PHP

Programación Orientada A Objetos

Autoloading De Clases

PHP

Programación Orientada A Objetos

Manejo De Errores Y Excepciones

PHP

Programación Orientada A Objetos

Manejo De Archivos

PHP

Programación Orientada A Objetos

Patrones De Diseño

PHP

Programación Orientada A Objetos

Introducción A Los Formularios En Php

PHP

Formularios

Procesamiento De Datos De Formularios

PHP

Formularios

Manejo De Archivos En Formularios

PHP

Formularios

Redirecciones Y Retroalimentación Al Usuario

PHP

Formularios

Formularios Dinámicos Y Separación De Lógica

PHP

Formularios

Introducción A La Persistencia En Php

PHP

Persistencia

Conexión A Bases De Datos

PHP

Persistencia

Consultas Y Operaciones Crud

PHP

Persistencia

Gestión De Transacciones

PHP

Persistencia

Manejo De Errores Y Excepciones En Base De Datos

PHP

Persistencia

Patrones De Acceso A Datos

PHP

Persistencia

Concepto De Sesiones En Php

PHP

Sesiones Y Cookies

Configuración De Sesiones

PHP

Sesiones Y Cookies

Cookies

PHP

Sesiones Y Cookies

Manejo Avanzado De Sesiones Y Cookies

PHP

Sesiones Y Cookies

Principales Vulnerabilidades En Php

PHP

Seguridad

Seguridad En Formularios Y Entrada De Datos

PHP

Seguridad

Protección Frente A Inyección Sql

PHP

Seguridad

Gestión De Contraseñas Y Cifrado

PHP

Seguridad

Seguridad En Sesiones Y Cookies

PHP

Seguridad

Configuraciones De Php Para Seguridad

PHP

Seguridad

Introducción Al Testing En Php

PHP

Testing

Phpunit

PHP

Testing

Cobertura De Código En Testing

PHP

Testing

Test Doubles (Mocks, Stubs, Fakes, Spies)

PHP

Testing

Pruebas De Integración Y Funcionales

PHP

Testing

Accede GRATIS a PHP y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  1. Entender la importancia de las pruebas automatizadas en PHP.
  2. Identificar los beneficios de las pruebas en el desarrollo de software.
  3. Aprender sobre distintos tipos de pruebas: unitarias, integración, funcionales, aceptación, regresión, rendimiento, seguridad y usabilidad.
  4. Reconocer cómo las pruebas aumentan la confianza y seguridad en el proyecto.
  5. Aplicar estrategias de testing en proyectos PHP para asegurar calidad.