はじめに
Yii Framework 1.x 系で Codeception を試してみました。
Codeception の公式サイトを見ると、Yii1 Module というものがありますが、
ちょっと設定などがよくわからなかったので、自分なりにセットアップしてみました。
( Codeception に関する詳しい情報は公式サイトをご覧ください: http://codeception.com/ )
protected/tests ディレクトリの入れ替え
既存のテストファイルを Codeception に入れ替える感じでやっていきます。
とりあえず protected/tests を protected/tests_default にリネームして、
composer.json で codeception 行を追加して Codeception をインストール。
{
"require": {
"yiisoft/yii": "1.1.14-rc"
},
"require-dev": {
"codeception/codeception": "*",
"phpunit/phpunit-selenium": "*",
"phpunit/phpunit-story": "*",
"phpunit/dbunit": "*",
"phpunit/php-invoker": "*"
}
}
composer update
次に bootstrap コマンドで protected 以下に Codeception のファイルを作成。
./vendor/bin/codecept bootstrap protected
データベースを扱っている場合は protected/tests/_data/ にテスト用のデータをエクスポートし、
そのあと protected/codeception.yml でデータベースの設定などをする。
paths:
...
settings:
...
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=hoge_test'
user: 'testuser'
password: 'testpass'
dump: tests/_data/hoge_test.sql
ユニットテストを実行してみる
protected/tests/unit.suite.yml で Db モジュールを使うように修正
class_name: CodeGuy
modules:
enabled: [Db, CodeHelper]
変更後は build コマンドを忘れずに
../vendor/bin/codecept build
protected/tests/unit/_bootstrap.php を以下のように修正
<?php
$yii = dirname(__FILE__).'/../../../vendor/yiisoft/yii/framework/yii.php';
$config = dirname(__FILE__).'/../../config/test.php';
require_once($yii);
if (!Yii::app()) {
Yii::createWebApplication($config);
}
ユニットテスト自体は元の tests_default/unit/ にあったものをコピペして
extends を DbTestCase から \PHPUnit_Framework_TestCase に修正すれば、
そのまま扱えるかと思います。
また、共通で扱うメソッドなどを別クラスに書いている場合は
tests/_helpers/CodeHelper.php などに移しておくといいかもしれません。
( 利用時は use Codeception\Module\CodeHelper;
)
で、ユニットテストの実行は以下
../vendor/bin/codecept run unit
受け入れテストを実行してみる
protected/tests/acceptance.suite.yml で 扱うモジュールを書いて PhpBrowser の url を修正。
変更後は build
を忘れずに。
class_name: WebGuy
modules:
enabled: [PhpBrowser, Db, WebHelper]
config:
PhpBrowser:
url: 'http://local.hoge/index-test.php'
次に cept ファイルを生成。
../vendor/bin/codecept generate:cept acceptance hoge/Index
cept ファイルはページ毎にファイルを生成しテストを書く感じなので、
個人的にはコントローラ毎にディレクトリを分けたほうが、テストしやすいかなと思います。
( cest ファイルにする場合は特にしなくてよいかも )
あとは /tests/acceptance/word/IndexCept.php にテストを書いて実行。
../vendor/bin/codecept run acceptance -d
Yii のインスタンスが欲しい場合
受け入れテストや機能テストでも Yii のインスタンスが欲しい場合は
tests/unit/ の _bootstrap.php と同じような感じにすればいいと思います。
また、unit, acceptance, functional の _bootstrap.php で共通の処理をしている場合は、
tests/ にある _bootstrap.php にまとめてしまうほうがいいかもしれません。
まとめ
Yii1 Module で書かれている CodeceptionHttpRequest などは
全く使っていないわりに動いたのでちょっと不安ですが、
YIi 1.x 系での Codeception の導入のやり方などをまとめてみました。