CodeIgniter で PHPUnit によるアプリケーションテストを実行するための CIUnit をインストールする
(2015/05/14) CodeIgniter 3.0 用のツールを開発中です。CI PHPUnit Test for CodeIgniter 3.0
(2011/09/05) 記事が古くなったので、更新した記事 CodeIgniter 2.0.3 に PHPUnit/CIUnit をインストールする を書きました。
CIUnit とは?
CIUnit は、CodeIgniter のアプリケーションテストに PHPUnit を使うためのツールです。公式サイトは、以下です。
しかし、このサイトは CodeIgniter 1.7.2 までしかサポートされていない状態のまま止まっています。ただし、開発リポジトリは Bitbucket にあり、最新の開発中のコードにアクセスできると記載されています。
ただし、最新の開発中のコードもまだ、CodeIgniter 2.0 に完全に対応していません。
そこで、ここでは、CIUnit 本家の最新のコードを元に CodeIgniter 2.0 に対応させたコードをインストールしサンプルのテストを実行してみます。なお、2.0 対応は、すでに以下のブログで行われています。この記事でのコードもこの成果を取り入れたものです。
PHPUnit のインストール
CIUnit は PHPUnit を使うものですので、まず、PHPUnit がインストールされている必要があります。PHPUnit は PEAR でインストールします。
$ 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 本家の最新の開発中のソースを元に修正を加えた開発中のものです。フォルダ構成や微妙な仕様などが今後変更される可能性があります。
CodeIgniter 2.0 対応させた CIUnit のソースは以下にあります。
Mercurial を使う場合は、
$ hg clone https://bitbucket.org/kenjis/my-ciunit
などとして clone してください。
Mercurial を使わない場合は、以下のリンクより最新のコードをダウンロードしてください。
中には、application/ と tests/ の 2つのフォルダがありますので、これらのフォルダを CodeIgniter のフォルダにコピーします。
「日本語言語パック All in One パッケージ (CodeIgniter 2.0.1)」(ci-ja-all-in-one-2.0.1-1.zip) にインストールする場合は、以下のようになります。
$ cd kenjis-my-ciunit-9b08f666b827/ $ cp -R application /path/to/ci-ja-all-in-one-2.0.1-1/ $ cp -R tests /path/to/ci-ja-all-in-one-2.0.1-1/
フォルダ構成は、現在、以下のようになっています。
ci-ja-all-in-one-2.0.1-1/ application/ third_party/ CIUnit/ ... CIUnit 本体 tests/ controllers/ ... コントローラのテスト fixtures/ ... フィクスチャ helpers/ ... ヘルパーのテスト libs/ ... ライブラリのテスト models/ ... モデルのテスト system/ ... システム(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 と表示されます。
CIUnit でのモデルのテスト方法 へ続く。