Compartir comentarios
Las respuestas se generan en base a la documentación.

Ejecutar pruebas de PHP en un contenedor

Requisitos previos

Completa todas las secciones anteriores de esta guía, comenzando con Contenedorizar una aplicación PHP.

Descripción general

Las pruebas son una parte esencial del desarrollo de software moderno. Las pruebas pueden significar muchas cosas para diferentes equipos de desarrollo. Existen pruebas unitarias, pruebas de integración y pruebas de extremo a extremo. En esta guía, revisaremos cómo ejecutar tus pruebas unitarias en Docker al desarrollar y al construir la imagen.

Ejecutar pruebas al desarrollar localmente

La aplicación de ejemplo ya tiene una prueba PHPUnit dentro del directorio tests. Al desarrollar localmente, puedes usar Compose para ejecutar tus pruebas.

Ejecuta el siguiente comando en el directorio docker-php-sample para ejecutar las pruebas dentro de un contenedor.

$ docker compose run --build --rm server ./vendor/bin/phpunit tests/HelloWorldTest.php

Deberías ver una salida que contenga lo siguiente.

Hello, Docker!PHPUnit 9.6.13 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.003, Memory: 4.00 MB

OK (1 test, 1 assertion)

Para obtener más información sobre el comando, consulta docker compose run.

Ejecutar pruebas al construir

Para ejecutar tus pruebas al construir, necesitas actualizar tu Dockerfile. Crea una nueva etapa de prueba que ejecute las pruebas.

El siguiente es el Dockerfile actualizado.

# syntax=docker/dockerfile:1

FROM composer:lts as prod-deps
WORKDIR /app
RUN --mount=type=bind,source=./composer.json,target=composer.json \
    --mount=type=bind,source=./composer.lock,target=composer.lock \
    --mount=type=cache,target=/tmp/cache \
    composer install --no-dev --no-interaction

FROM composer:lts as dev-deps
WORKDIR /app
RUN --mount=type=bind,source=./composer.json,target=composer.json \
    --mount=type=bind,source=./composer.lock,target=composer.lock \
    --mount=type=cache,target=/tmp/cache \
    composer install --no-interaction

FROM php:8.2-apache as base
RUN docker-php-ext-install pdo pdo_mysql
COPY ./src /var/www/html

FROM base as development
COPY ./tests /var/www/html/tests
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY --from=dev-deps app/vendor/ /var/www/html/vendor

FROM development as test
WORKDIR /var/www/html
RUN ./vendor/bin/phpunit tests/HelloWorldTest.php

FROM base as final
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY --from=prod-deps app/vendor/ /var/www/html/vendor
USER www-data

Ejecuta el siguiente comando para construir una imagen utilizando la etapa de prueba (test) como objetivo (target) y ver los resultados de la prueba. Incluye --progress plain para ver la salida de la construcción, --no-cache para garantizar que las pruebas siempre se ejecuten y --target test para apuntar a la etapa de prueba.

$ docker build -t php-docker-image-test --progress plain --no-cache --target test .

Deberías ver una salida que contenga lo siguiente.

#18 [test 2/2] RUN ./vendor/bin/phpunit tests/HelloWorldTest.php
#18 0.385 Hello, Docker!PHPUnit 9.6.13 by Sebastian Bergmann and contributors.
#18 0.392
#18 0.394 .                                                                   1 / 1 (100%)
#18 0.395
#18 0.395 Time: 00:00.003, Memory: 4.00 MB
#18 0.395
#18 0.395 OK (1 test, 1 assertion)

Resumen

En esta sección, aprendiste cómo ejecutar pruebas al desarrollar localmente usando Compose y cómo ejecutar pruebas al construir tu imagen.

Información relacionada:

Pasos siguientes

A continuación, aprenderás cómo configurar un pipeline de CI/CD utilizando GitHub Actions.