• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

symfony 単体(ユニット)・機能テストする

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

symfonyで入力フォームを作るへ戻る

symfony Unit And Functional Testing

ひたすらガリガリ作ると、
予期しないところで問題が発生する。
その理由のほとんどがテスト不足である。

先ほどの入力画面を作っていてアレ?っと思った人は感が良い。
例えばメールアドレスにメールアドレス以外を入れても、
そのまま素通りしてしまう。
などなど、現在の状態では穴だらけだ。

しかし、ページで何度も入力したりするのは効率が悪い上、
うまくいっているという確証がとれない。
そこで今回はテストを通じて問題点を塞いでいく。

symfony limeテストフレームワーク

symfonyではテストフレームワークにlimeというのが採用されている。
version1以前はsimpletestだったらしいが。
特徴はイマイチよく知らない。

symfony テストケース作成

symfony テストケース作成 概要

穴だらけのシステムを埋めるテスト作業での大半は
テストケース作成に終始する。
テストを書いてバリデータを調整しての繰り返し。
面倒ではあるが、
ここで面倒なことをやっておく方が後々楽になるので我慢すること。

テストケースでは「こうならないと困る」をひたすら羅列する。
実際の場面を想定しなければならないため、
経験がモノを言う。

symfony とりあえずテスト実行してみる

moduleをgeneratorで生成した時点で
以下のファイルが追加されている。
test/functional/myapp/inquiryActionsTest.php

<?php
 
include(dirname(__FILE__).'/../../bootstrap/functional.php');
 
// create a new test browser
$browser = new sfTestBrowser();
$browser->initialize();
 
$browser->
  get('/inquiry/index')->
  isStatusCode(200)->
  isRequestParameter('module', 'inquiry')->
  isRequestParameter('action', 'index')->
  checkResponseElement('body', '!/This is a temporary page/')
;

とりあえずテストしてみる。

$ symfony test-functional myapp inquiryActions
# get /inquiry/index
ok 1 - status code is 200
ok 2 - request parameter module is inquiry
ok 3 - request parameter action is index
ok 4 - response selector body does not match regex /This is a temporary page/
1..4

結果については今は考えなくて良い。

symfony テストケース作成

例えば今回の設計では、
ビジネスロジックをDoに集約させている。
なのでこのDoにはPostリクエスト以外は受け付けたくないわけだ。
しかし、symfonyの仕組み上

http://dozo.matrix.jp/inquiry/do

と入力するとアクセスできてしまう。 そうなっては困るのでそれをテストケースに書く。

直接doにブラウザでアクセスしてきた時は、 indexに移動しなければならない、 という記述を追加。

<?php
 
include(dirname(__FILE__).'/../../bootstrap/functional.php');
 
// create a new test browser
$browser = new sfTestBrowser();
$browser->initialize();
 
// path validate
$browser->get('/inquiry/do')->isForwardedTo('inquiry', 'index');

テストをしてみると。

symfony test-functional myapp inquiryActions
# get /inquiry/do
ok 1 - request is forwarded to the inquiry module (last)
not ok 2 - request is forwarded to the index action (last)
#     Failed test (/usr/local/lib/php/symfony/vendor/lime/lime.php at line 99)
#            got: 'do'
#       expected: 'index'
1..2
# Looks like you failed 1 tests of 2.

not ok 2と二つ目のテストisForwardedToに失敗しているのがわかる。

symfony Actionを修正し再度テスト

test/functional/myapp/inquiryActionsTest.php
に以下のコードを追加する。

class inquiryActions extends sfActions
{
 
//  ・・・・
 
  public function handleErrorDo()
  {
    $this->forward('inquiry', 'index');
  }
}

もう一度テストしてみると。

symfony test-functional myapp inquiryActions
# get /inquiry/do
ok 1 - request is forwarded to the inquiry module (last)
ok 2 - request is forwarded to the index action (last)
1..2

今度は両方とも成功している。

このようにしてテストを繰り返し、
バグのないソースコードにしていく。
テストケースはキチンと保存しておき、
内容修正やリファクタリング時に使用する

symfonyバリデーションに続く

symfony 単体(ユニット)・機能テストする 解説

handleErrorDo

viewの名前が何故Successなのか?
と疑問に思った人も多いと思う。
それはsuccessに対してerrorがあるからだ。
(名称の指定もできる。)

handleErrorはバリデーション(入力チェック)で問題があった場合に表示するビューdoError.phpの代わりに動いてくれるメソッドだ。
バリデーションは通常問題があった場合入力画面に戻すのがセオリー。
エラーを出す画面と入力画面の内容はほとんど同じなので、
改めてdoError.phpを作成せず、
遷移先だけハンドラで指定するわけだ。

symfonyバリデーションに続く


framework/symfony/入力テスト.txt · 最終更新: 2007/06/17 02:58 by dozo