Laravelで初めて自動テストを書いてみましたが、知らずに実施して焦ってしまう挙動があったりしたので残しておこうと思います。実行環境は以下になります。
- Laravel 8
- mariadb 10.6.4
テスト用DBでテストを実行する
テスト用のDBを用意してあげないと開発用のDBでテストが実行されます。そして自動テストが実行されるとDBの内容が全て消えます。正確にはRefreshDatabaseトレイトを利用すると消えます。
毎回まっさらな状態でテストできるのでありがたいのですが、開発用DBには消したくないデータもまま存在するので、自動テスト実行用のDBを用意していきます。
自動テスト用DBの用意
データベースにrootで接続します。接続先は適宜変更。
mariadb -u root -p -h host_name
DBを作成します。ここでは名前をtestとしておきます
CREATE DATABASE test;
testのDBにアクセス権を設定します。ユーザー名やパスワードは適宜変更。
GRANT ALL ON test.* TO user@'%' IDENTIFIED BY 'password';
以下のコマンドでDBが作られたか確認します。
SHOW DATABASES;
phpunit.xmlの修正
phpunit.xmlファイルのphpタグの中に以下のコードを追加します。
<server name="DB_DATABASE" VALUE="TEST" />
<server name="DB_USERNAME" VALUE="user" />
<server name="DB_PASSWORD" VALUE="password" />
全文はこんな感じ30~32行目が該当行です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?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> </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> <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <!-- <server name="DB_CONNECTION" value="sqlite"/> --> <!-- <server name="DB_DATABASE" value=":memory:"/> --> <server name="MAIL_MAILER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="TELESCOPE_ENABLED" value="false"/> <server name="DB_DATABASE" value="test"/> <server name="DB_USERNAME" value="user"/> <server name="DB_PASSWORD" value="password"/> </php> </phpunit> |
これで自動テストのときだけ別のDBで実行してくれるようになりました。