読者です 読者をやめる 読者になる 読者になる

サンゴラボ

4年目ソシャゲエンジニア

FuelPHPでモジュールを使ったときのユニットテスト

FuelPHP PHPUnit

FuelPHPでソースコードを機能毎にモジュール分割したときに、ユニットテストが動かせなくて苦労しました。なんとかテストを走らせることができたので手順をまとめておきます。ちなみにやったのはモデルのテストだけです。

1. PHPUnitの設定ファイル(phpunit.xml)の編集

参考:unit_tests_for_modules

fuel/core/phpunit.xmlを直接編集するのではなく、まずはfuel/appにコピーする。

FuelPHP内でPHPUnitにテスト用のファイルとして認識されるのは、デフォルトでは以下の3つのディレクトリ配下のみです。

  • fuel/core/tests ・・・コアクラスのテスト
  • fuel/app/tests ・・・アプリケーションのテスト。
  • fuel/packages/*/tests ・・・パッケージのテスト

なので、モジュール分割したときのテストファイルを置く場所を設定します。公式ドキュメントにも例として書かれているので、以下をコピーしたphpunit.xmlの<testsuites></testsuites>に追記します。

<testsuite name="modules">
 <directory suffix=".php">../app/modules/*/tests</directory>
</testsuite>

これで、/fuel/app/modules/*/tests配下にあるファイルがテストケースファイルとして認識されます。


2. テストケースクラスの@groupアノテーションで「Modules」を指定

1.でtestsuite要素のname属性の値をmodulesにしたので、テストケースクラスの@groupアノテーションにはModulesを指定します。MakeGoodを使えばアノテーションを指定しなくてもテストを実行できます。

<?php
namespace Mymodule //名前空間の指定を忘れずに!
/**
 * Unit Tests for Modules
 *
 * @group Modules
 */
class Test_Testclassname extends \TestCase
{
    // テスメソッド
}

次のように、oilコマンドでモジュールにあるテストを実行できます。

oil test --group=Modules


3. テストケースクラスでのモジュールの読み込み

参考:FuelPHP how to load model in test? and how to load and test controller?

一番つまづいたのがモデルの読み込みのとこです。モジュール分割してもコントローラからは問題なくモデルを読み込めたので、名前空間だけ合わせればテストケースでも同じように読み込めると思ってました。

参考ページによると、モジュールはURL通してコントローラにアクセスしたときに自動的にロードされるらしく、今回のようなテスト(oil)経由での実行時は、モジュールを手動で読み込まないとだめらしい。てことで、モジュール分割した場合は、テストケースのsetUpBeforeClass()メソッドあたりで次のようにモジュールを読み込む必要があります。

\Module::load('mymodule');


あと、config.phpのAlways Loadでモジュールを自動読み込みすることもできたけど、なんかしっくりこなかったし、テスト以外でもロードされるのでやめました。test用のconfig.php用意するならアリかなと思ったのですが、それは上手く行かなかった。ちなみにbootstrap.phpでテスト環境にすれば上手くいきました。