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.