Laravel9 sailでテスト用MySQLのdockerコンテナの作成方法
Laravel9 sailでテスト用MySQLのdockerコンテナの作成方法について紹介します。
1.docker-compose.ymlに下記を追記
基本的にMySQLのコンテナイメージの記述箇所をコピーして、変更・追加と書かれている箇所を修正すればいいです。
尚、この記事は、Laravel sailを利用している事を前提としています。
また、dokcer-compose.ymlファイルはバージョンによって内容が変更される場合がありますので、参考程度にご利用ください。
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
↓ 上記を元に下記をコピーして貼り付ける
mysql_test: # 追加
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3307}:3306' # 変更
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}_test' # 追加
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql_test' # 追加
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
2.mysql_test起動
sail up -d
下記はYoutubeで解説している動画になります。
テスト用MySQLをアプリ用MySQLと一致させる方法について
1.テスト用のenvファイルを作成する。
.envファイルを元に.env.testingファイルを作成します。(コピー)
.env.testingファイルには下記の内容を記載します。
DB_CONNECTION=mysql
DB_HOST=mysql_test # 修正(docker-compose.ymlで指定したテスト用のDBホスト名)
DB_PORT=3306 # ここはdocker内部からアクセスするため、3306のままでOK
DB_DATABASE=books_test # 修正(ocker-compose.ymlで指定したテスト用のDB名)
DB_USERNAME=sail
DB_PASSWORD=password
2.テストDBのmigrationをする
php artisan migrate --env=testing
laravelのphpunitの設定ファイルについて
下記サンプルです。
- testsuiteでUnitテスト、Featureテストを分けます。
- excludeでテストから除外したいファイルを指定します。
- coverageでカバレッジ対象を指定します。
- phpのenvセクションでenvファイルを指定します。この例だと、「.env.testing」ファイルが読み込まれます。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" > <testsuites> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> <!-- <exclude>./tests/Unit/ExampleTest.php</exclude>--> </testsuite> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> </testsuites> <coverage processUncoveredFiles="true"> <include> <directory suffix=".php">./app</directory> </include> </coverage> <php> <env name="APP_ENV" value="testing"/> <env name="BCRYPT_ROUNDS" value="4"/> <env name="CACHE_DRIVER" value="array"/> <!-- <env name="DB_CONNECTION" value="sqlite"/> --> <!-- <env name="DB_DATABASE" value=":memory:"/> --> <env name="MAIL_MAILER" value="array"/> <env name="QUEUE_CONNECTION" value="sync"/> <env name="SESSION_DRIVER" value="array"/> <env name="TELESCOPE_ENABLED" value="false"/> </php> </phpunit>
テストコードの実行方法について
テストコードの実行方法はいくつかあります。
特にlaravel sailを利用していれば簡単にテストを実行する事が出来ます。
$ sail test
$ sail php artisan test
$ sail shell
$ ./vendor/bin/phpunit
応用
testsuite毎にテストを実行できる
$ php artisan test --testsuite=Feature # featureのみ実行する
$ php artisan test --testsuite=Unit # Unitのみ実行する
excludeで不必要なテストを除外する
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
<exclude>./tests/Unit/ExampleTest.php</exclude>
</testsuite>
helpのやり方
$ sail php artisan test --help
Laravelのテストファイルの作成方法について
コマンドは下記です。sailを利用している場合は、sail php artisanと続けてください。
sailを利用していない場合は、sailは入力が不要です。
- featureテストファイルを作成したい場合は、オプションなし
- unitテストファイルを作成したい場合は、–unitとオプションをつけてください。
$ sail php artisan make:test UserTest # featureの作成
$ sail php artisan make:test UserTest --unit # unitの作成