phpUnitでcakePHPのテスト知見まとめ

投稿者: | 2017-12-15

概要

3日間ぐらいで体得したCakePHPのテストユニットを活用したテストの知見まとめ
チームへの情報共有用を公開しても問題ない文言に差し替えたものです。

Install

参考:CakePHP テスト-3.x

まずPHPUnitをインストールする。

$ php composer.phar require --dev phpunit/phpunit:"^5.7|^6.0"

以下コマンドで実行可能

$ vendor/bin/phpunit

また、テストケースを指定してテストすることも可能。以下例。

$ vendor/bin/phpunit tests/TestCase/Model/Table/ArticlesTableTest

特に、モデルの依存関係が今回面倒なことになっていたり、そもそもまだ書いてないテストが適応されたりするので、
対象のコントローラのみをテストする方が賢い?(もちろん、最後には通しでテストする必要があるだろうが)。

ディレクトリ構造(ざっくり)

project/                   -- プロジェクトフォルダ(名前は色々)
    ├ config/              -- テスト用の設定もここ
    └ tests/               -- テストファイル群
        ├ Fixture/         -- テストに用いるための一時的なデータ群が管理されるフォルダ(後述)
        ├ Controller/      -- コントローラのテストケース
        ├ Model/           -- モデルのテストケース
        └ View/            -- ビューのテストケース(触ってない)

ページを取得できるかどうかのテスト例(get)

以下に示す例はコントローラのテストなのでHogesControllerTest.phpに書く。

assertResponseOk()メソッドは、レスポンスに2xx系がくればテストを通す

もっと厳密に、テンプレートが表示されたかどうかをアサートするには

とすると良い。

他のアサーションメソッドは公式ドキュメントを参照。

何らかのデータをPostするテスト(例:ログインフォーム)

post()メソッドの引数に乗せて送信する。この例では、loginにユーザ名、passwordにパスワードを乗せ、ログイン成功後のページにリダイレクトされているか、また、セッションにユーザが保存されているか(=>正常にログインできているか)を見ている。

セッションを必要とするメソッドのテスト

例えば、ログイン後にしかアクセスできないページに紐づいているメソッドをテストする場合、

セッションにAuth以下をセットしてから処理する。逆に、ログインしてない状態では弾くテストをする場合

ログインに成功した場合、接続を試みた対象のページから戻る設定があるのでURLは

/hoges/login

ではなく

/hoges/login?redirect=%2Fhoges%2Fpiyo

である(っぽい)。したがって、assertRedirectContains()メソッドを使う方が良い。

DBとFixture

ログイン処理などのテストには、ユーザ名とパスワードをペアを保存したDBが必要である。
テストでは、設定がデフォルトであればテスト用のDBに接続する。
テスト用のDBに接続するための設定はconfig/app.phpに書く。

Fixtureは一時的に使えるデータセットで、tests/Fixtureに入っている。Fixtureはテーブル名に則って、FugasFixture.phpのように名付けられる。bakeでも作れる。大抵はFixtureを生成する元になるテーブル名を指定する。

$ bin/cake bake fixture fugas

Fixtureはロードしないと使えないので必ずロードする。

HogesControllerTestでFugasFixtureを読み込みたい時は、以下のようにする

もちろんModelテスト内でも読み込める。

ログイン機能のテストをするとき、Fixtureのpasswordにはハッシュ後のパスワードを入れる。

データをPostし、保存されているかを見るテスト

正しい形式でデータをPostしたあと、それがDBに保存されているかをFindで発見する。データがあれば結果は1件以上。whereにはユニークかつ今Postしたデータかどうかを確認できるものが望ましい。

パスワードをPostして変更を見る場合のテスト

DefaultPasswordHasherのインスタンスからcheck()メソッドを利用して正誤を確かめる。

期待したステータスコードが返ってこない時

200系を期待したけど違うコードが返ってきた!みたいな時に疑うべきこと。

500 -- コントローラ側でエラーが出ている可能性がある。大体テストケースでのfixtureの読み忘れとか。
       コントローラ自体がおかしいならテスト書く前に直せ。

404 -- コントローラ若しくはアクションの指定の仕方が間違っているかも。
       cakaPHPのルーティングを確認する。

400 -- enableCsrfToken()とかenableSecurityToken()の付け忘れが多い。
       コンポーネントが有効かつフォームを扱うなら入れる。

302 -- セッションがセットされておらずloginページに戻された時とかに頻出。

余談

このドキュメントを僕はチームの奴らに聖書と呼ばせています。