開発がひと段落してきたゆきねこです。
そろそろ自動テスト入れたいよねーということで自動テストをやろうとしたら引っかかったりしたので書いていきたいと思います。
datebaseの問題
まず、データベースの問題ですよね。
テストデータでDBが汚染されないかとか、データが初期化しないかとか。
この問題の解決方法は2つあります。
DatabaseTransactionsを使用する
artisanでテストを作成するとデフォルトではこのテストが入っています。
use Illuminate\Foundation\Testing\RefreshDatabase;
こちらなのですが、テストが終わったらmigrationを行うモジュールなんですね。
use Illuminate\Foundation\Testing\DatabaseTransactions;
異なるデータベースを使用する
次に、異なるデータベースを使用する方法です。
予めhogehoge_testのようなDBを作成します。
それを、.env.testingのようなテスト用の.envを作成して設定します。
DB_CONNECTION=mysql DB_HOST= DB_PORT= DB_DATABASE= DB_USERNAME= DB_PASSWORD=
こうすればそのデータベースのデータはおかしくなっても初期化すればいいだけですね。
今回はこの方法でテストをすることになったのですが、何点か引っかかったところがあったので記載しておきます。
ネットワークエラー
開発ではdockerを使用しているのですが、dockerの中に入らないでローカルホストでテストを実行すると以下のエラーメッセージが出ます。
PDOException: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
docker exec hogehoge /bin/bashなどで中に入ってからテストを実行しましょう。
databaseが存在しない
次に、以下のエラーメッセージです。
Illuminate\Database\QueryException: SQLSTATE[HY000] [1049] Unknown database 'hogehoge_test' (SQL:
見ればわかる様に、hogehoge_testというテーブルは存在しないというメッセージです。
今回、自動テストを行うためにhogehoge_testというテーブルを設定したので、作ってなかったらエラーが出ます。
忘れずにデータベースを作ってあげましょう。
ちなみに、mysqlに入って以下のコマンドを打つだけです。
create database hogehoge_test;
tableが存在しない
データベースを作成しても、スキーマを設定しなかったら以下のエラーが出ます。
Illuminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'hogehoge_test.user' doesn't exist (SQL: hogehoge
hogehoge_testデータベースにuserなんてテーブルないよってエラーです。
sql dumpして既存のデータベースからスキーマを写してあげましょう。
0件のコメント