CIUnit: Unit testing for CodeIgniter(2)

CodeIgnigter

CIUnit
CIUnit: Unit testing for CodeIgniter

サイトによると・・・
CIUnit は、Codeigniterで作ったアプリケーションとphpUnitを繋ぐためのブリッジの役割をするもののようです。
「tested with 1.6.X, 1.7.0 and 1.7.1」ということなので、1.7.0 1.7.1でもテストが出来ます。

[Download the current fooStack v0.15 here!]というテキストリンクからダウンロードしました。
開発バージョンと旧式のバージョンはbitbucket.org / ciunitというところを見ると良いらしいです。
bitbucket(びっとばけつ)というものをはじめて知りました。
フォルダ名等、通常の構造のままであることが、使用の前提のようです。
英語苦手なので、自分用に翻訳してみました(^-^;)

Install it as follows:インストール方法(訳)

1.fooStackディレクトリ をコピーして、
/system/application/librariesの直下に設置します。

2. テストをするCodeIgniterアプリは、標準のレイアウトを使用していることを想定しています。

3. testsディレクトリをコピーして
/system/applicationの直下に設置します

4. system/codeigniter/CodeIgniter.phpを
ダウンロードした同名のファイルと入れ替えます。

5. rsystem/application/config/database.phpを改変します。

$active_group = "default";

の部分を

$env_used = 'default'; //where default would be the name of your development setting
      if(defined('CIUnit_Version')){
        $env_used .= '_test';
      }
      $active_group = $env_used;

・・・と置き換えちゃいます。

6. ‘テストデータベースとして機能する新しいデータベース設定を作成します。
(テストを実行すると、それはいつもクリアになります)
データベースの名前は開発環境のようですが、‘_test’とつけてください。
【注意】CIUnit fixturesは、データベース名の後ろに、’_test’とつけて、それを使うことで
テストの実行によるDBデータの損失を防ぐようになっています。

訳してみたけど微妙な文書になってる気がする・・・

追記:2009.05.31
テスト用のデータベースの設定が必要です。
私は開発中のDBのコピーをDB名_testで作成して、テスト用のDBにしました

$db['default_test']['hostname'] = "localhost";
$db['default_test']['username'] = "DBの接続ユーザ";
$db['default_test']['password'] = "パスワード";
$db['default_test']['database'] = "テスト用データベース";
$db['default_test']['dbdriver'] = "mysql";
$db['default_test']['dbprefix'] = "";
$db['default_test']['pconnect'] = TRUE;
$db['default_test']['db_debug'] = TRUE;
$db['default_test']['cache_on'] = FALSE;
$db['default_test']['cachedir'] = "";
$db['default_test']['char_set'] = "utf8";
$db['default_test']['dbcollat'] = "utf8_general_ci";

Run tests テストを走らせてみる。
1.すべてのテストディレクトリからテスト

$ phpunit AllTests.php

実行した結果

phpunit AllTests.php
PHPUnit 3.1.8 by Sebastian Bergmann.

FFFFFFF

Time: 0 seconds

There were 7 failures:

1) Warning(PHPUnit_Framework_Warning)
No tests found in class "CiunitAllTests".

2) Warning(PHPUnit_Framework_Warning)
No tests found in class "SystemAllTests".

3) Warning(PHPUnit_Framework_Warning)
No tests found in class "LibsAllTests".

4) Warning(PHPUnit_Framework_Warning)
No tests found in class "ModelsAllTests".

5) Warning(PHPUnit_Framework_Warning)
No tests found in class "ViewsAllTests".

6) Warning(PHPUnit_Framework_Warning)
No tests found in class "ControllersAllTests".

7) Warning(PHPUnit_Framework_Warning)
No tests found in class "HelpersAllTests".

FAILURES!
Tests: 7, Failures: 7.

2.サブグループだけのテスト

$ cd models
$ phpunit ModelAllTests.php

実行した結果

[root@localhost models]# phpunit ModelsAllTests.php 
PHPUnit 3.1.8 by Sebastian Bergmann.

F

Time: 0 seconds

There was 1 failure:

1) Warning(PHPUnit_Framework_Warning)
Constructor of class "testSomeModel" is not TestCase($name) or TestCase().

FAILURES!
Tests: 1, Failures: 1.

3.特定の1つだけのテストの場合は
テストを書いたディレクトリに移動して、テストを書いたファイルそのものを実行してください

Generating database fixtures

ちと意味がわからなかった・・・・テスト用DBのかわりにyamlで代用が出来るよ的な内容かなとは思う・・・・

テスト用のテーブルを、作ることが出来ます。
(テスト用のデータベースそのものを用意するべきですが・・・)
テスト用ファイルは、tests/fixtures/以下で利用可能です。
ディレクトリに対して書き込み可能な状態にしてください。
テスト用ファイルは、yamlのフォーマットで記載します。
yamlにテスト用のデータを記載してください。

$this->dbfixt('items', 'comments', 'users');

テストから、機能をセットアップしてください。
そうすると、テストデータベースに読み込まれるので、変数をテストで利用可能になります。

$this->items_fixt, 
$this->comments_fixt, 
$this->users_fixt.

テストデータベースのコメントテーブルのデータの2番目の行も利用可能です。

$this->comments_fixt['second'];

CIUnit tests itself CIUnit自体のテスト
テストを全く書かずにテストを実行してください。

$ phpunit CIUnitAllTests.php

・・・を実行すると、2つか3つぐらいのテストの結果が返ってきます。
これは、CIUnitが正しくインストールされていることを確認するためのテストです。

そして実際にテストを書いてみる
・・・が、私はまだphpUnitの使い方もよくわかっていないorz
設置したtestsフォルダの中に、サンプルのコードがありました。

system/application/tests/controllers/testWelcome.php

<?php

include_once dirname(__FILE__).'/../CIUnit.php';

class testWelcome extends CIUnit_TestCase{

    function setUp(){
	$this->CI = set_controller('welcome');
    }

    public function testWelcomeController(){
      $this->CI->index();
      $out = output();
      $this->assertSame(0, preg_match('/(error|notice)/i', $out));
    }

}

tests/models,tests/libsの中にも同じような感じでサンプルのコードがありました。

追記:2009.05.30
phpUnitのチュートリアルをやってみて、CIUnitのテストを書いてみたけどうまくいかない。
サンプルに追記をしてみても、改変をしてみても

1) Warning(PHPUnit_Framework_Warning)
Constructor of class "testWelcome" is not TestCase($name) or TestCase().

と、テストケースが無いよと言われる。
設置した直後の状態と、サンプル(tests/controllers/testWelcome.php)に追記したあとも、
テスト結果が変わらない(T-T)

追記:2009.05.30 04:01
lllnorikolllさんが教えてくださったサイト・・・・
http://jaciss.wordpress.com/2008/02/18/phpunit-error-testcasename-or-testcase/
phpUnitをインストールしなおせということのようです・・・・orz

追記:2009.05.30
pearをアンインストールしたあと、したりインストールしたりを繰り返したら動くようになりました(><)
ありがとうlllnorikolllさん!!!

アンインストールした後、

# ll /usr/share/pear

で確認してみたら、なぜかPHPUnit/があったのでフォルダごと削除してから、再度phpunitをインストールしてみたら、テストが通るようになりました。
なぜだかはわからないけれども、
とにかくテストを書く手前までたどり着けました(><)ノ