フィクスチャを定義する
=================

自動化テストは何度も実行される必要があります。
テストのプロセスが繰返し可能であることを保証するために、**フィクスチャ (fixture)** と呼ばれる一定の既知の状態においてテストを走らせることが要求されます。
例えば、ブログアプリケーションで記事作成機能をテストするためには、毎回テストを走らせるたびに、記事に関係するデータを保存するテーブル (`Post` テーブルや `Comment` テーブル) が一定の固定された状態に復元されなければなりません。
[PHPUnitのドキュメント](http://www.phpunit.de/manual/current/ja/fixtures.html) に、一般的なフィクスチャのセットアップに関するきちんとした説明があります。
この章では、主として、先ほど例を挙げて説明したような、データベースのフィクスチャをセットアップする方法について説明します。

データベースのフィクスチャをセットアップすることは、おそらく、データベースをバックエンドに持つウェブアプリケーションのテストにおいて、最も時間を消費する部分の一つでしょう。
Yii はこの問題を軽減するために [CDbFixtureManager] アプリケーションコンポーネントを導入しています。
このコンポーネントは、基本的には、一連のテストを走らせる際に、以下のことを行います。

 * 全てのテストが走る前に、テストに関係する全てのテーブルを一定の既知の状態にリセットする。
 * 個々のテストメソッドが走る前に、指定したテーブルを一定の既知の状態にリセットする。
 * 個々のテストメソッドの実行中に、フィクスチャに関係するデータの行に対するアクセスを提供する。

[CDbFixtureManager] を使うために、[アプリケーション初期構成](/doc/guide/basics.application#sec-2) を以下のように構成します。

~~~
[php]
return array(
	'components'=>array(
		'fixture'=>array(
			'class'=>'system.test.CDbFixtureManager',
		),
	),
);
~~~

次に、フィクスチャのデータをディレクトリ `protected/tests/fixtures` の下に置きます。
このディレクトリは、アプリケーション構成の中で、 [CDbFixtureManager::basePath] を構成して、別のディレクトリにカスタマイズすることも出来ます。
フィクスチャのデータは、フィクスチャファイルと呼ばれる一群の PHP ファイルとして組織されます。個々のフィクスチャファイルは、特定のテーブルについて、初期状態のデータ行を表す配列を返します。
ファイル名はテーブル名と同じです。
以下の例は、`Post.php` という名前のファイルに保存された `Post` テーブルのためのフィクスチャデータです。

~~~
[php]
<?php
return array(
	'sample1'=>array(
		'title'=>'test post 1',
		'content'=>'test post content 1',
		'createTime'=>1230952187,
		'authorId'=>1,
	),
	'sample2'=>array(
		'title'=>'test post 2',
		'content'=>'test post content 2',
		'createTime'=>1230952287,
		'authorId'=>1,
	),
);
~~~

ご覧のように、上記では2行のデータが返されています。
各行は、キーがカラム名、値が対応するカラムの値を示す連想配列として表現されます。
それに加えて、各行は **行エイリアス** と呼ばれる文字列 (例えば `sample1` や `sample2`) でインデックスされます。
後でテストスクリプトを書くときに、行をエイリアスで参照することが出来るので便利です。
これについては、次の章で詳しく説明します。

上のフィクスチャにおいて `id` カラムの値を指定していないことに気付いたかも知れません。
これは `id` カラムがオートインクリメントの主キーとして定義されており、その値は行を挿入したときに自動的に埋められるからです。

[CDbFixtureManager] は、最初に参照されたときに、すべてのフィクスチャファイルを読んで、それに基づいて対応するテーブルをリセットします。
テーブルをリセットするために、全ての行を削除し、オートインクリメントの主キーのためのシーケンス値をリセットし、そして、フィクスチャファイルからテーブルにデータ行を挿入します。

時として、一連のテストを実行する前に、フィクスチャファイルを持つ全てのテーブルをリセットすることを望まない場合があります。
あまりに多くのフィクスチャファイルによるリセットを実行すると非常に長い時間がかかるからです。
その場合には、カスタマイズした方法で初期化作業をするように、PHP スクリプトを書くことが出来ます。
スクリプトは `init.php` という名前のファイルとして、他のフィクスチャファイルを格納しているのと同じディレクトリに保存しなければなりません。
[CDbFixtureManager] はこのスクリプトの存在を検出すると、全てのテーブルをリセットする代りにこのスクリプトを実行します。

同じように、テーブルをリセットするデフォルトの方法、すなわち、全ての行を削除してフィクスチャデータを挿入するという方法を望まない場合も有り得ます。
もしそうであるなら、特定のフィクスチャファイルのための初期化スクリプトを書くことが出来ます。
スクリプトは、テーブル名の後に `.init.php` を付けた名前にしなければなりません。
[CDbFixtureManager] はこのスクリプトを見出すと、テーブルをリセットするために、デフォルトの方法を使う代りに、このスクリプトを実行します。

> Tip|ヒント: フィクスチャファイルをあまりに多く持ちすぎると、テスト時間が劇的に増加します。
この理由から、フィクスチャファイルを提供するのは、テストの間に内容が変化する可能性のあるテーブルに限定すべきです。
参照されるだけのテーブルは内容が変りませんから、フィクスチャファイルは不要です。

次の二つの章においては、ユニットテストと機能テストにおいて、[CDbFixtureManager] によって管理されるフィクスチャをどのように利用するかを説明します。

<div class="revision">$Id$</div>