Skip to content

Testing ES

Technomantus Corvi edited this page Sep 5, 2026 · 1 revision

Testing

Instalar PHP desde cero (Ubuntu/Mint)

sudo apt update
sudo apt install php8.1 php8.1-cli php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-zip unzip
Paquete Por qué
php8.1-mysql Driver PDO (Database::connect())
php8.1-xml dom/xmlwriter, necesarios para los reportes de PHPUnit
php8.1-mbstring, php8.1-curl, php8.1-zip Necesarios para Composer

Usa php8.1-pgsql en vez de (o junto a) php8.1-mysql para PostgreSQL.

Instalar Composer

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Instalar PHPUnit

PHP 8.1 requiere PHPUnit 10.x (11+ deja de soportar 8.1):

composer init --name="tu-usuario/tanuki-base" --type=project --no-interaction
composer require --dev "phpunit/phpunit:^10.5"

Configuración

phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/bootstrap.php" colors="true">
    <testsuites>
        <testsuite name="Unit"><directory>tests/Unit</directory></testsuite>
        <testsuite name="Feature"><directory>tests/Feature</directory></testsuite>
    </testsuites>
</phpunit>

tests/bootstrap.php:

<?php
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../utils.php';
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../core/Model.php';
require_once __DIR__ . '/../core/Request.php';
require_once __DIR__ . '/../core/Controller.php';

$envFile = file_exists(__DIR__ . '/../.env.testing')
    ? __DIR__ . '/../.env.testing'
    : __DIR__ . '/../.env';

if (file_exists($envFile)) {
    foreach (file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
        $line = trim($line);
        if ($line === '' || $line[0] === '#' || !str_contains($line, '=')) continue;
        [$key, $value] = explode('=', $line, 2);
        $_ENV[trim($key)] = trim($value, " \t\"'");
    }
}

.env.testing (nunca lo subas — apunta a una base de datos desechable):

APP_ENV=testing
DB_DRIVER=mysql
DB_HOST=localhost
DB_NAME=tanuki_db
DB_USER=tu_usuario_test
DB_PASS=tu_password_test

Considera usar DB_DRIVER=sqlite aquí en su lugar — no necesita ningún servicio corriendo, lo que simplifica mucho el CI.

Ejecutar los tests

./vendor/bin/phpunit                          # todo
./vendor/bin/phpunit --testsuite Unit         # no requiere base de datos
./vendor/bin/phpunit --testsuite Feature      # requiere la BD de test
./vendor/bin/phpunit tests/Feature/TodoModelTest.php

Convenciones de la suite de tests

  • Los tests Unit nunca tocan base de datos. Los Feature sí, contra la BD de test real.
  • setUp() vacía la tabla correspondiente antes de cada test para aislarlos; considera beginTransaction()/rollBack() según crezca la suite.
  • Añade un test de regresión por cada bug sutil que arregles — la propia suite del framework incluye tests para el bug del valor falsy en env() y el fix de inyección SQL por nombre de columna como ejemplos de este patrón.

Clone this wiki locally