Masayan tech blog.

  1. ブログ記事一覧>
  2. 【環境構築】docker環境でPHPUnitのテスト環境を構築する

【環境構築】docker環境でPHPUnitのテスト環境を構築する

公開日

サーバー構築

dockerでテスト用のDBサーバーとphpMyAdminサーバーを立てる

docker Desktopアプリを起動

あらかじめフォルダや必要なファイルを置いていますので、Githubよりソースコードをクローンして使ってください。

git clone https://github.com/masayan1126/docker-laravel.git

ymlファイルがあるディレクトリに移動

cd docker-laravel

docker-compose.ymlのうち、テスト用のdbコンテナとphpmyadminコンテナの記載のみ抜粋しています。
ポイントは以下の3つです。

  • container_nameの名前を本番のdbコンテナとは別にする(同じ名前のコンテナを立ち上げることはできないため)
  • volumesでマウントするローカルファイルのパスを本番のdbコンテナとは別にする
  • ホスト側のポート番号を本番のdbコンテナと同じにしない(同じマシン内で同じポート番号を指定することはできない)

docker-compose.yml

version: "3.8"

services:
  db-test:
    image: mysql:latest
    container_name: db-test
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: recipe_test_db
      TZ: "Asia/Tokyo"
      command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db-test/data:/var/lib/mysql
      - ./docker/db-test/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db-test/sql:/docker-entrypoint-initdb.d
    ports:
      - 3307:3306

phpmyadmin-test:
  image: phpmyadmin/phpmyadmin
  container_name: phpmyadmin-test
  environment:
    - PMA_ARBITRARY=1
    - PMA_HOST=db-test
    - PMA_USER=root
    - PMA_PASSWORD=root
  links:
    - db-test
  ports:
    - 8889:80
  volumes:
  - /sessions

あらかじめ指定したイメージファイルをビルド

docker-compose build

コンテナ起動

docker-compose up -d

無事起動

Laravelでプロジェクト作成

ここまでで、サーバーの構築が完了したので、コンテナに入り、laravelプロジェクトを作成していきます。

appコンテナに入る

appコンテナ(アプリケーションサーバー)へ入る

docker-compose exec app bash

laravelのプロジェクトを作成する

laravelプロジェクトのベースを作成(laravel-portfolioの箇所は任意の名称ですが、変更した場合は、nginx/defalut.confのroot /var/www/laravel-portfolio/public;も変更する必要があるので注意)

composer create-project laravel/laravel laravel-portfolio

laravelのプロジェクトディレクトリに移動

cd laravel-portfolio

テスト用の設定

マイグレーション(DB)設定

.env.exampleファイルをコピーして、本番DB用の.envとテスト用のenv(.env.testing)を作成

.env

# ymlファイルのサービス名を指定 
DB_HOST=db
DB_PORT=3306
# ymlファイルのMYSQL_DATABASEを指定
DB_DATABASE=performance_db
DB_USERNAME=root
DB_PASSWORD=root

.env.testing

# ymlファイルのサービス名を指定 
DB_HOST=db-test
DB_PORT=3306
# ymlファイルのMYSQL_DATABASEを指定
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=root

.env.testingのAPP_KEYを生成

php artisan key:generate --env=testing

それぞれマイグレーション

php artisan migrate
php artisan migrate --env=testing

.gitignoreへ.env.testingを追加

.gitignore

.env
.env.testing

サンプルのテストファイルを実行

以下コマンドでテストを実行できる

.\vendor\bin\phpunit

もしくは

php artisan test

テスト結果

テストの種類

Featureテスト

実際の通信を伴う機能テスト(/tests/Feature)

1つのHTTPリクエスト単位の動きをテストする。
=ルーティング1つごとにテストクラス(ファイル)を作る
=コントローラのアクションメソッド単位でのテスト

UnitTestでテストした各クラスを結合した状態で
コントローラの動き(つまりリクエストを受けてレスポンスを返すまで)をテストするというイメージ。

作成用コマンド

php artisan make:test [テストケースクラス名]

Unitテスト

PHPクラス単位の単体テスト(/tests/Unit)

Service、Model、Middleware、Policyなど、
自分で作ったクラス1つ1つと対応するように
テストクラス(ファイル)を1つ1つ作る。

その対象クラスのメソッド1つ1つの動作を検証するための
テストケースをコードに書いていく。

作成用コマンド

php artisan make:test [テストケースクラス名] --unit

最後に

以上です。次回は実際にテストコードを書いてテストしてみたいと思います。

まとめ

いかがでしたでしょうか。本記事ではdockerとlaravelでPHPUnitのテスト環境を構築する手順について紹介しています。具体的には、テスト用のDBサーバーの起動後、コンテナ内でlaravelのプロジェクトを作成し、テスト用のマイグレーション設定を行なった後にサンプルのテストコードを実行しています。