開発がひと段落してきたゆきねこです。

そろそろ自動テスト入れたいよねーということで自動テストをやろうとしたら引っかかったりしたので書いていきたいと思います。

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して既存のデータベースからスキーマを写してあげましょう。

カテゴリー: PHP

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です