skillup

技術ブログ

PHP

CakePHP3 Unitテスト モデル編

投稿日:

長らくやろうやろうと思っていながら手がつかなかったCakePHP3のユニットテストについて。

以前にも何らかのエントリーで書いたのですが(下記参照)、モデル系はなかなかやらなかったので、これを機に説明させていただきます。

CakePHP3系でのテスト処理
CakePHP3でのコレクションに関して(厳密にはテストではないですが、デバッグに便利)

注意点ですがなんといっても「テスト用のテーブルはドロップされる」でしょう。初期化ではなく、テーブル自体がなくなってしまいます。

これが何といっても一番注意しなくてはいけないでしょう。設定ファイル(下記参照)で設定されたテスト用のデータベースですが、なんとデータベースはドロップされます。

http://onlineconsultant.jp/pukiwiki/?CakePHP3%20PHPUnit%20%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8B

これはデータベースのテストという観点から考えると当たり前かもしれません。

データベース系のテストの場合、なんといっても前提条件となる状態を保存しておくことが大切になります。

そのため下記のような手順が本来は望ましいです。

  1. 内部のデータを一度保存
  2. データベースを初期化
  3. 前提となるデータを入れる
  4. テストを行う
  5. 1で保存したデータをリストアする

参考(DBUnit)

http://skill-up-engineering.com/?p=924

Cakeの場合2~5が実行されることになります。

知らないで使っているデータベースをつなぐとえらいことになるので気を付けましょう。

Fixture

また上記のステップ3で使用する前提となるデータですがFixtureというクラスで定義されています。

ディレクトリは/tests/Fixtureです。※最初はbakeで作るのが良いと思います。

ここに入っているデータがテスト中は一時的に取り込まれますが、テストを行うとそもそもテーブル自体がドロップされますのでデバッグして途中で止めない限りはわかりません。

Fixtureを作るのはbakeが一番楽でしょう。よく考えるとテーブルの状態も変わっていくことがほとんどなので実際のテーブルを持たずに、都度更新しておいたほうが理にかなっています。

また上記の2~5のステップは1テストごとに実行されるのでそれぞれのメソッドでの状態変化は考えなくてもよいです。

ソース

超簡単なテストですが、Fixtureと実際のモデルのテストケースのソースを記述させていただきます。

Fixture

テストケース

※実際にはテストはしておらず単なるデバッグですが・・・

 

-PHP
-,

執筆者:


comment

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

関連記事

no image

CakePHP3 Csvプラグイン

cakePHPでのCSVダウンロードプラグインを実装 Contents1 インストール2 プログラム3 注意点4 参考 インストール composer.jsonに下記のように書いてcomposer u …

no image

Laravelのサービスプロバイダ

ミドルウェアやルーティング同様、惰性で使っていたサービスプロバイダについてめも。 Contents1 サービスプロバイダとは2 参考リンク・参考文献 サービスプロバイダとは Laravelでは特定のサ …

no image

xdebugに関して

PHPでお手軽にできるdebugツールとしてxdebugを。 Contents1 利点2 インストール3 参考リンク 利点 var_dumpの結果が非常に見やすい(単純ですがこれが一番大きい理由です。 …

no image

Laravelでのmiddlewareの実行順番

Laravelでのmiddlewareをいじって認証直後の処理を作りたいときなど。 例えばログイン後、ユーザーidに応じた共通処理などをかませたいときです。 この場合、当然ログインの後に処理を実行しな …

no image

cakePHP CSVのインポートとエクスポート

本日もcakeネタです。 CSVインポート&エクスポート CSVのインポートとエクスポートについて。 かなりいろいろなプラグインがあるようですが、一番楽なのはbehaviorを使う手法のようです。 a …