10-05-2026

Phpspec: la herramienta de bdd para desarrolladores php

PHPSpec es un framework de especificación (spec) para PHP que promueve el BDD, Behavior Driven Development y se integra con el Spec Driven Development.
Fue creado por Marcello Duarte y el equipo de SensioLabs, y se mantiene activo en la comunidad.
A diferencia de PHPUnit, que es más orientado a pruebas unitarias tradicionales, PHPSpec está pensado para describir el comportamiento esperado de las clases y objetos de forma natural y legible, casi como si se estuviera escribiendo documentación ejecutable. PHPSpec ayuda a escribir código más limpio, con mejor diseño y más mantenible.

Ventajas de Usar PHPSpec

  • Legibilidad extrema: Los tests (llamados specs) se leen como prosa inglesa.
  • Diseño guiado por comportamiento: Te obliga a pensar primero en la interfaz pública de tus clases.
  • Generación de código: Puede generar automáticamente el código esqueleto de tus clases a partir de las especificaciones.
  • Mocks integrados y potentes: Usar Prophet, un excelente mocking library.
  • Enfoque en OOP: Ideal para código bien diseñado y orientado a objetos.
  • Integración: Funciona perfectamente junto a PHPUnit (muchos proyectos usan ambos).
Prophet es el framework de mocking que utiliza PHPSpec por defecto.

Instalación

La forma más sencilla es mediante Composer:

composer require --dev phpspec/phpspec
Configuración básica ("phpspec.yml"):

suites:
main:
namespace: App
psr4_prefix: App
src_path: src

Escribiendo la Primera Spec

Se que queremos modelar un carrito de compras:

vendor/bin/phpspec describe "App\\CarritoDeCompras"
Esto genera automáticamente el archivo:

// spec/App/CarritoDeComprasSpec.php
namespace spec\App;

use App\CarritoDeCompras;
use PhpSpec\ObjectBehavior;

class CarritoDeComprasSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType(CarritoDeCompras::class);
}
}
Ahora se implementa el comportamiento:

// spec/App/CarritoDeComprasSpec.php
function it_permite_agregar_productos()
{
$producto = new Producto('Laptop', 1200);

$this->agregar($producto, 1);
$this->contarItems()->shouldReturn(1);
$this->calcularTotal()->shouldReturn(1200);
}

function it_calcula_total_con_multiple_cantidad()
{
$producto = new Producto('Mouse', 25);

$this->agregar($producto, 3);
$this->calcularTotal()->shouldReturn(75);
}

Comandos Más Útiles

Buenas Prácticas con PHPSpec

  1. Nombrar las specs como preguntas:"it_should_calculate_total_with_discount()"
  2. Mantener las specs enfocadas: Una spec por comportamiento.
  3. Usar "let()" y "letGo()" para configurar contexto:

    function let()
    {
    $this->beConstructedWith(new CalculadoraImpuestos());
    }
    
  4. Evita probar implementación interna (métodos privados). PHPSpec te empuja a probar solo la interfaz pública.