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

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

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

記事を読む

no image

jQuery Mobileの1.0Beta3、1.0RC1で起きた現象 -iOS5で動かない!?-

最近おきたjQuery Mobile周りについてのメモ。 本来なら色々チェックしてちゃんと原因を調

記事を読む

no image

CakePHP1.2から1.3への変更作業

CakePHP1.2から1.3への変更作業でおこなったことまとめ。 思ったよりも面倒なので、誰かの

記事を読む

no image

さくらのVPSでJenkins -執事さんとご対面-

さくらのVPSを利用している方は多いかと思います。 私も、自分で遊ぶ用(開発用)として借りてみまし

記事を読む

no image

jQuery Mobileではまったこと -広告が表示されない!($.mobile.changePage()でのページ遷移)-

swipeした際にページ遷移をさせるためにjQueryMobileの$.mobile.changeP

記事を読む

no image

Jenkins+Capistranoを設定した時にしたこと -「ポート変更」「公開鍵認証」対応-

* 前段階 上記にあるように、Jenkins+Capistranoの設定をしています。 ただし、設

記事を読む

no image

MySQLのバックアップ手順 -消えたら困るものはバックアップ-

そろそろデータが消えてもらったら困るぐらいになっていたのでバックアップをとることにしました。 とい

記事を読む

no image

str_padとsprintfの速度

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

記事を読む

no image

CAPTCHAの導入方法 -KCAPTCHAの導入-

CakePHP(1.2、1.3)にKCAPTCHAを導入してみたのでメモ。 * CAPTCHA

記事を読む

no image

iPhoneアプリ開発 −フォントの変更−

一言:最近、iPhoneアプリの開発のためMacばかり触ってて、Windowsに戻ると混乱します。

記事を読む

広告

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 ↑