ホーム » Laravel9 sailでテスト用MySQLのdockerコンテナの作成方法

Laravel9 sailでテスト用MySQLのdockerコンテナの作成方法

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の作成