アプリケーション用DBとユニットテスト用のDBを分けたいときがあると思います
よく見かける手法がユニットテストをインメモリDBとして立ち上げてそこでデータを投入する方法です
今回は、インメモリDBではなく、通常使用するようなDB(オンディスクDBと呼ばれるらしい)でユニットテストの時だけ切り替える方式です
前提
Doker環境で二つのmysqlを立ち上げます
二つどうやって立ち上げるかわかない方はこちらの記事を参照してください
結論
- テストDB用のドライバーを設定
- ユニットテスト実行時に、そのドライバーを指定
設定方法詳細
テストDB接続用のドライバーを設定する
LaravelがテストDBに接続できるようにドライバーを設定します
config/database.php
'test_mysql' => [
'driver' => 'mysql',
'host' => 'test_mysql',
'port' => '3306',//ここが3307だと繋がらない。なんで?
'database' => 'your_test_db',
'username' => 'user',
'password' => 'password',
'unix_socket' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => 'InnoDB',
'options' => array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]),
],
phpunitの実行時のDBドライバーを変更
ユニットテストを実行したときだけテストDBを読み込むようにドライバーを指定します
phpunit.xml
//before
//<server name="DB_CONNECTION" value="mysql"/>
//after
<server name="DB_CONNECTION" value="test_mysql"/>
疑問
config/database.phpでportをデフォルト3306にしないと接続できないのはなぜなんだろう。。。
dockerでテスト用DBは3307にしていて、phpmyadminでは3307で接続できているのに
誰か知っていたらコメントなどで教えてください
宣伝
ツイッターもやってます
技術や製品開発に関する事などを呟いてますので、フォローお願いします
https://twitter.com/wkyIghw8MlLpyJE