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

cakePHPのajax

cakePHPのajaxですが、javascriptはいいとして、コントローラー側をどう実装するのか気になる方は多いでしょう。 cakeの画面は基本的にコントローラーにアクセスした後は通常はビューに遷 …

no image

ループ処理+switch

PHPでちょっと小ネタ foreachやwhileのようなループを抜けるときにcontinueを使うんですが、その中にswitchが入っていると、switchに対してのcontinueがきいてしまって …

no image

phpの時分秒+cakePHPのupdate

ちょっと小ネタ集になります。 Contents1 PHPで秒→時分秒変換2 cakePHPでのupdate PHPで秒→時分秒変換 PHPで秒数から時分秒に変換するプログラムです。 汎用的かなと思った …

no image

Laravelのサービスプロバイダ

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

no image

laravelでの名前空間変更

laravelでの名前空間変更について。 laravelでモデルの場所はディフォルトだとapp/直下に作られます。 これをapp/Modelというディレクトリを作ってnamespaceを正常に定義した …