⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Exécuter des tests PHP dans un conteneur

Prérequis

Terminez toutes les sections précédentes de ce guide, en commençant par Conteneuriser une application PHP.

Aperçu

Les tests sont une partie essentielle du développement logiciel moderne. Les tests peuvent signifier beaucoup de choses pour différentes équipes de développement. Il y a les tests unitaires, les tests d'intégration et les tests de bout en bout. Dans ce guide, vous verrez comment exécuter vos tests unitaires dans Docker lors du développement et de la construction.

Exécuter les tests lors du développement local

L'application exemple a déjà un test PHPUnit dans le répertoire tests. Lors du développement local, vous pouvez utiliser Compose pour exécuter vos tests.

Exécutez la commande suivante dans le répertoire docker-php-sample pour exécuter les tests à l'intérieur d'un conteneur.

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

Vous devriez voir une sortie contenant ce qui suit.

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)

Pour en savoir plus sur la commande, consultez docker compose run.

Exécuter les tests lors de la construction

Pour exécuter vos tests lors de la construction, vous devez mettre à jour votre Dockerfile. Créez une nouvelle étape de test qui exécute les tests.

Voici le Dockerfile mis à jour.

# 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

Exécutez la commande suivante pour construire une image en utilisant l'étape de test comme cible et afficher les résultats des tests. Incluez --progress plain pour afficher la sortie de la construction, --no-cache pour vous assurer que les tests s'exécutent toujours, et --target test pour cibler l'étape de test.

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

Vous devriez voir une sortie contenant ce qui suit.

#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)

Résumé

Dans cette section, vous avez appris à exécuter des tests lors du développement local à l'aide de Compose et à exécuter des tests lors de la construction de votre image.

Informations connexes :

Prochaines étapes

Ensuite, vous apprendrez à configurer un pipeline CI/CD à l'aide de GitHub Actions.