フィクスチャを定義する

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

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

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

CDbFixtureManager を使うために、application configuration を以下のように構成します。

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

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

<?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行のデータが返されています。 各行は、キーが列名、値が対応する列の値を示す連想配列として表現されます。 それに加えて、各行は 行エイリアス と呼ばれる文字列(例えば sample1sample2)でインデックスされます。 後でテストスクリプトを書くときに、行をエイリアスで参照することが出来るので便利です。これについては、次のセクションで詳しく説明します。

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

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

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

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

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

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

$Id: test.fixture.txt 3039 2011-03-09 19:48:15Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.