CakePHP1.3でテストコード(1) -モデルのテスト-

公開日: : CakePHP, IT, SimpleTest, テスト


CakePHP1.3ではSimpleTestを用いてテストコードを書きます。
※CakePHP2系ではPHPUnitになっています。

今回、すでにあるサービスにテストコードを導入することにしたので覚書。
まずは、モデルに対してテストをケースを作成してみます。

 事前準備

 SimpleTestをダウンロード&設置

  1. SimpleTestをダウンロード

    • ※注意点※ 1.1系は利用できないので、1.0系をダウンロード
  2. ダウンロードして解凍した「simpletest」フォルダを/app/vendors/配下に移動

    • または、/vendors/配下に移動

 テスト用のデータベースの設定

すでにあるサービスに対してテストをおこなうため、本来のテーブルとは異なるテスト用のテーブルを扱うようにします。
そこで、データベースの設定ファイルの$testを記述します。
※$testがないと$defaultが使われます。

ファイルの場所:app/config/database.php

  var $test = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'user',
    'password' => 'password',
    'database' => 'sample',
    'prefix' => 'test_',
  );

prefixに値を入れることによりテスト用のテーブルを扱うようにしています。
※実際にテーブルを作る必要はありません。

 テスト用データの準備

 フィクスチャ(fixture)を用いてデータ準備

テストで利用する一時的なデータのためにフィクスチャを用います。

基本的なフィクスチャの流れは以下のとおり。
引用:502 Bad Gateway

  1. 各フィクスチャで必要なテーブルを作成する。
  2. フィクスチャにデータが存在すれば、それをテーブルに投入する。
  3. テストのメソッドを実行する。
  4. フィクスチャのテーブルを空にする。
  5. データベースからフィクスチャが作成したテーブルを削除する。

フィクスチャの記述例は以下のような感じです。
ただし、設置場所やファイル名に決まりがあります。
[ルール]

  • 設置場所:app/tests/fixturesディレクトリ
  • ファイル名:今回の例だと、sample_fixture.php(xxxx_fixure.phpになります)
<?php
class SampleFixture extends CakeTestFixture {
   var $name = 'Sample';
   var $import = 'Sample';
    //テスト用データ
    var $records = array(
        array(
            'id'  => 1,
            'name'=> 'サンプル',
        ),
    );
}

今回のケースのように、すでにテーブルの情報がある場合は、$importを使って指定します。
あとはテストデータを上記のように$recordsに値を入れます。

 すでにあるデータを使う場合
  • app/config/database.phpの$testの値をデータが入っているデータベースに変更
  • $importを以下のように記述
var $import = array('model' => 'Article', 'records' => true);

※すでにあるデータを使う場合で、フィクスチャの書き方を間違えるとそのデータが消えてしまうこともあるので注意してください。

 テストの作成・実行

ここまでくれば、あとはテストコードを実際に書いて実行するだけです。

 テストコードの記述(モデル)

Sampleモデル(CakePHP1.3で記述したモデル例)

<?php
class Sample extends AppModel
{
   var $name = 'sample';
   var $useTable = 'sample';
   /**
    * データ取得(id使用)
    * @param $id ID
    */
   public function get($id)
   {
        $conditions = array('id' => $id,);
        $field = array('id', 'name');
        $params = array(
            'conditions' => $conditions,
            'fields' => $field);
        $data = $this->find('first',$params);
        return $data;
   }
}

このgetメソッドに対するテストコードを書いてみます。
モデルのテストコードの例は以下のとおりです。
ただし、フィクスチャ同様に設置場所やファイル名に決まりがあります。

[ルール]

  • 設置場所:app/tests/cases/ディレクトリ
  • ファイル名:今回の例だと、sample_test.php(xxxx_test.phpになります)
<?php
class SampleTestCase extends CakeTestCase {
    var $fixtures = array('app.sample'); //フィクスチャ
    function startTest() {
        $this->Sample =& ClassRegistry::init('Sample');
    }
    function endTest() {
        unset($this->Sample);
        ClassRegistry::flush();
    }
    /**
     * 簡単なテスト例
     */
    function testGet() {
        $result = $this->Sample->get(1);
        $expected = array('Sample' =>
                          array('id' => 1,
                                'name' => 'サンプル', ), );
        //一致するかどうか
        $this->assertEqual($result, $expected);
    }
}

assertEqualで、実際の値と期待した値が一致するかをチェックしています。

 テストの実行

  1. テストケースを作成したら、以下にアクセス

    • サービスのアドレス/test.php

      • ローカル環境でやっているなら、http://localhost/service名/test.phpとかですかね。
  2. 左側に表示されている「App」の「Test Cases」をクリック
  3. App Test Casesに表示された「models/Sample」をクリック

以上の操作で記述したテストが表示されます。

 おまけ

今回は、すでにあるCakePHP1.3で作ったサービスでのテストコードの導入についてちょろっと書きました。
ただ、今回のようにテストの実行をtest.phpにアクセスしておこなうというのは非常に面倒&無駄です。

そこで、テストの実行に関してはJenkinsを利用してソースがコミットされる度に、テストを実行する方法に変えていったほうがいいですね。

 参考サイト

広告

関連記事

no image

github-flowを使っての開発(3) -1つのプロジェクトを複数人で開発-

今まで2回ほどgithub-flowをもとにした開発の流れを書きました。 今回は、複数人で開発をする

記事を読む

no image

str_padとsprintfの速度

PHPで同じことが出来る「str_pad」と「sprintf」。 今まではsprintfを使う機会

記事を読む

no image

Androidアプリ開発 -リストをタッチして別ページ表示-

* 前提 -「設定画面」で各種項目を設定。 --Activity:ConfigActivity --

記事を読む

no image

iPhoneアプリを開発してての疑問 -教えてエライ人!-

MacでiPhoneアプリを開発してて疑問に思ったのの解決してないことを列挙。 知識不足をさらけ出し

記事を読む

no image

jQuery Mobileでミスしたこと -JSだけ最新にしてしまってレイアウト崩れたの巻-

* 前提(CDN先) jQuery Mobileを使う場合、cssを自前のサーバにおいて、jsはC

記事を読む

no image

jQuery Mobileの初期設定 -jQuery Mobieを利用時にページ内リンクさせたい-

* 前提 jQuery Mobileを利用していて、以下のタグを使ってページ内遷移したいことがありま

記事を読む

WordPressプラグイン「WP Hatena Notation」にPullRequestを投げた話

WordPressではてな記法が利用できる「WP Hatena Notation」を重宝しています。

記事を読む

no image

iPhoneアプリ開発 −遷移先のViewControllerに値を引き継ぎたい−

例えば、トップページに複数個のボタンがあって、「A」と「B」というボタンを押下した際に、同じView

記事を読む

no image

Facebookがちょっとコワイ vol.1 -自分の情報をコントロールできない-

Facebookの最近の広がり方などを見ていて、少々不安を感じたので思ったことをつらつらと書いてみま

記事を読む

no image

iPhoneアプリ開発 -iOS6から変わったこと-

Deployment Targetを5.1にしていた時には気がつかなかったのですが、iOS6になって

記事を読む

広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

広告

no image
[感想] Effective Objective-C 2.0 ☆☆☆☆★(4.5)

* 構成 - 第1章 Objective-Cに慣れる -

no image
[感想] iOSアプリテスト自動化入門 ☆☆☆(3.0)

* 構成 - Chapter 1 テスト自動化への取り組み

DeployGateを試してみた(iOS編) -DeployGateがiOSに対応-

今までのDeployGate - -[http://pplace.

iPhone/iPadアプリを開発するためにやったこと

今までに、iPhoneを3本ほどリリース((リリースしたアプリは全て1

no image
ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –

* やりたいこと macのターミナルでgitをいじっていると -今の

→もっと見る

PAGE TOP ↑