CodeIgniter 2.0.3 に PHPUnit/CIUnit をインストールする

(2015/05/14) CodeIgniter 3.0 用のツールを開発中です。CI PHPUnit Test for CodeIgniter 3.0

本日、CodeIgniter 2.0.3 の日本語言語パック がリリースされました。

少し前に、以下のようなつぶやきを見かけましたので、CodeIgniter 2.0.3 での CIUnit のインストール方法について解説しておきます。

ほんとうは、CIUnit のインストールは簡単です。

(2011/09/07) CIUnit をさらに楽にインストールする を追加しました。

CIUnit とは?

CIUnit は、CodeIgniter のアプリケーションテストに PHPUnit を使うためのツールです。公式サイトは、以下です。

しかし、このサイトは CodeIgniter 1.7.2 までしかサポートされていない状態のまま止まっています。ただし、開発リポジトリは Bitbucket にあり、最新の開発中のコードにアクセスできると記載されています。

ただし、最新の開発中のコードもまだ、CodeIgniter 2.0.3 に完全に対応していません。

そこで、ここでは、CIUnit 本家の最新のコードから fork した以下の CIUnit を使います。

PHPUnit のインストール

CIUnit は PHPUnit を使うものですので、まず、PHPUnit がインストールされている必要があります。PHPUnitPEAR でインストールします。

$ sudo pear channel-discover pear.phpunit.de
$ sudo pear channel-discover components.ez.no
$ sudo pear channel-discover pear.symfony-project.com
$ sudo pear install phpunit/PHPUnit

CIUnit のインストール

注意: 以下のソースは、CIUnit 本家の最新の開発中のソースから fork した開発中のものです。フォルダ構成や微妙な仕様などが今後変更される可能性があります。

ダウンロード

CodeIgniter 2.0.3 対応させた CIUnit のソースは、以下のリポジトリの「CI 2.0.3」ブランチからダウンロードします。

Mercurial を使う場合は、

$ hg clone https://bitbucket.org/kenjis/my-ciunit
$ cd my-ciunit
$ hg update "CI 2.0.3"

などとして取得してください。

Mercurial を使わない場合は、以下のリンクより最新のコードをダウンロードしてください。

なお、default ブランチは、GitHub で開発中の CodeIgniter 2.1.0-dev 用になっています。

インストール

中には、application/ と tests/ の 2つのフォルダがありますので、これらのフォルダを CodeIgniter のフォルダにコピーします。

「日本語言語パック All in One パッケージ (CodeIgniter 2.0.3)」(ci-ja-all-in-one-2.0.3-1.zip) にインストールする場合は、以下のようになります。

$ cd "kenjis-my-ciunit-CI 2.0.3"
$ cp -R application /path/to/ci-ja-all-in-one-2.0.3-1/
$ cp -R tests /path/to/ci-ja-all-in-one-2.0.3-1/

フォルダ構成は、現在、以下のようになっています。

ci-ja-all-in-one-2.0.3-1/
  application/
    third_party/
      CIUnit/ ... CIUnit 本体
  tests/
    controllers/ ... コントローラのテスト
    fixtures/    ... フィクスチャ
    helpers/     ... ヘルパーのテスト
    libs/        ... ライブラリのテスト
    models/      ... モデルのテスト
    system/      ... システム(PHP)のテスト
MY_Loader, MY_Output, MY_Session を使う場合

Loader, Output, Session クラスをオーバーライドする場合は、以下にある対応するクラスの親クラスを MY_* に変更してください。

  • application/third_party/CIUnit/core/CIU_*.php
  • application/third_party/CIUnit/libraries/CIU_*.php

テスト用データベースの準備

テスト用のデータベースを作成します。CIUnit ではテスト用のデータベースは名前が「_test」で終わる必要があります。

ここでは「ciunit_test」というデータベースを作成します。そして、CIUnit に含まれているサンプルのテストコードのための phone_carrier テーブルを作成しておきます。

CREATE TABLE IF NOT EXISTS `phone_carrier` (
  `name` varchar(255) NOT NULL,
  `txt_address` varchar(255) NOT NULL,
  `txt_message_length` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

また、CIUnit 用のデータベース設定ファイルとして以下のファイルを用意します。

application/config/testing/database.php

例として以下のようになります。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
|	['hostname'] The hostname of your database server.
|	['username'] The username used to connect to the database
|	['password'] The password used to connect to the database
|	['database'] The name of the database you want to connect to
|	['dbdriver'] The database type. ie: mysql. Currently supported:
|				 mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
|	['dbprefix'] You can add an optional prefix, which will be added
|				 to the table name when using the Active Record class
|	['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|	['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|	['cache_on'] TRUE/FALSE - Enables/disables query caching
|	['cachedir'] The path to the folder where cache files should be stored
|	['char_set'] The character set used in communicating with the database
|	['dbcollat'] The character collation used in communicating with the database
|				 NOTE: For MySQL and MySQLi databases, this setting is only used
| 				 as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7.
| 				 There is an incompatibility in PHP with mysql_real_escape_string() which
| 				 can make your site vulnerable to SQL injection if you are using a
| 				 multi-byte character set and are running versions lower than these.
| 				 Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
|	['swap_pre'] A default table prefix that should be swapped with the dbprefix
|	['autoinit'] Whether or not to automatically initialize the database.
|	['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|							- good for ensuring strict SQL while developing
|
| The $active_group variable lets you choose which connection group to
| make active. By default there is only one group (the 'default' group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
*/

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'ciunit_test';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;


/* End of file database.php */
/* Location: ./application/config/testing/database.php */

モデルの準備

CIUnit には Phone_carrier_model モデルのテストコードがサンプルとして含まれていますが、Phone_carrier_model モデル自体のコードは含まれていません。

とりあえず、テストが通るように、

application/models/phone_carrier_model.php

に以下のモデルを作成します。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Phone_carrier_model extends CI_Model {
	
	function __construct()
	{
		parent::__construct();
		$this->load->database();
	}
	
	function getCarriers(array $attributes)
	{
		foreach ($attributes as $field)
		{
			$this->db->select($field)->from('phone_carrier');
			$query = $this->db->get();
			foreach ($query->result_array() as $row)
			{
				$data[] = array($field, $row[$field]);
			}
		}
		
		return $data;
	}
	
}

/* End of file phone_carrier_model.php */
/* Location: ./application/models/phone_carrier_model.php */

テストの実行

テストを実行するには、まず、tests フォルダに移動します。

$ cd tests/

すべてのテストを実行するには、以下のようにします。

$ phpunit

モデルのテストのみを実行する場合は、以下のようにフォルダ名を指定します。

$ phpunit models

特定のテストのみ実行したい場合は、以下のようにファイル名を指定します。

$ phpunit models/PhoneCarrierModelTest.php

テストがすべて通った場合は、以下のように OK と表示されます。