Share feedback
Answers are generated based on the documentation.

コンテナーでの PHP テストの実行

前提条件

本ガイドの PHP アプリケーションのコンテナー化 から始まる前節までを完了していること。

概要

テストというものは、現代のソフトウェア開発においては重要な工程です。 開発チームによって、テストが意味するところはさまざまです。 ユニットテストがあり、インテグレーションテストがあり、エンドツーエンドテストがあります。 本ガイドでは Docker による開発およびビルド時におけるユニットテストの実行方法について見ていくことにします。

ローカルでの開発時におけるテスト実行

サンプルアプリケーションには、テストを実行するための PHPUnit テストが既に含まれていて、tests ディレクトリにあります。 ローカルにおいて開発を行っているときには Compose を使ってテストを実行することができます。

docker-php-sample ディレクトリにおいて以下のコマンドを入力して、コンテナー内部にてテストを実行します。

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

以下のような出力が得られるはずです。

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)

コマンドの詳細については docker compose run を参照してください。

ビルド時のテスト実行

ビルド時にテストを実行するには、Dockerfile を修正する必要があります。 テストを実行するためには、新たなテストステージの生成が必要です。

修正した Dockerfile ファイルは以下です。

# 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

以下のコマンドを実行します。 これは、テスト対象としてまたテスト結果を見るためのステージとしてテストステージを利用し、イメージをビルドするものです。 --progress=plain を加えることでビルド結果を確認します。 --no-cache は常にテストを実行させるためのものです。 --target test はテストステージをターゲットとします。

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

以下のような出力が得られます。

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

まとめ

この節では Compose を使ったローカル開発におけるテスト実行方法について学びました。 そしてイメージビルド時にテストを実行する方法についても学びました。

関連情報

次のステップ

次は GitHub アクションをつかって CI/CD パイプラインを設定する方法について学びます。