skillup

技術ブログ

PHP

CakePHP3 Unitテスト モデル編

投稿日:2017年1月23日 更新日:

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

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

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

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

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

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

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

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

  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

Shift_JISの5C問題について 全角ハイフンでエスケープ

エンジニアであればだれもが頭を悩ませる文字コード。 私も初期のころはこれのせいでデータが入らないとかおかしくなるなんてことがさんざんありました。 今でも文字コードに遭遇することはあるんですが大体のパタ …

no image

dateTimeの使い方

phpの日付ライブラリであるdateTimeについて。 Contents1 過去のリンク2 頻出表現3 リンク 過去のリンク CakePHP3 日付ライブラリ(Time)について http://ski …

no image

PHP_CodeSnifferによるコードチェック

昨日の記事でphpmdという静的解析ツールを調査したんですが、それ以外にも規約にのっとっているかどうかコーディングをチェックできるツールはあります。 PHP_CodeSniffer https://g …

no image

Laravel5.4インストール&ルーティング

来月からの仕事でLaravel5.4を使うことになったのでテストがてら自宅で勉強。 とりあえず下記リンクが参考になりました。 Laravel5.4でシンプルなCMSを作るチュートリアル 初めてのLar …

no image

Cakeの共通処理

CakePHPだけに限りませんが、フレームワークの場合、オブジェクト指向の特徴を理解して、全ページに共通な処理などは個々のコントローラーに書くのではなく、もっと抽象度の高いクラスに書いたほうが保守性が …