スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

symfony1.4 jobeet 9日目

今回は機能テストの説明。

イメージとしてはseleniumをコマンドラインから実行してる感じかな。
Webシステムのテストってこのリクエスト投げるとこんなレスポンスが返るよね。の繰り返しだからなんとか自動化したくてseleniumとかも調べたけどsymfonyの機能テストはまさに俺が求めてたもの。
1.0でも一度使ったんだけどその時はスケジュールがきつくなって途中でやめてしまった。

まずは、機能テストを実現するためのsfBrowserの説明とメッソドの説明。
この辺はチュートリアル読んでもらって要はsfBrowserでブラウザの動きをシミュレート出来ますよって話。

次に実際にテストを行うためのsfTestFunctionalクラスの説明。
limeでisとかでテストしてたのをリクエストが正しいかだとsfTestFunctionalのisParameterでチェックしたりする。
sfTestFunctionalが持ってるメソッドはチュートリアル見てください。

実際にテストケースを追記していくクラスはモジュール作成時にモジュール名ActionTest.phpというファイルでスケルトンコードが作成されます。
試しにカテゴリモジュールのテストを行います。
4件のテストケースが実行され、2件がエラーになりました。
これは自動で作成されるテストコードが以下のテストを行ってるためです。
category/indexの表示テスト
1.モジュールがcategoryである。
2.アクションがindexである。
3.ステータスコードが200である。
4symfonyのデフォルトページではない。
今回、categoryにindexアクションが存在しないので2,3のテストがエラーとなります。

機能テストを行う際にはデータベースに接続する必要があります。
job/indexを表示するとjobデータが○件表示される。とかは実際テーブルからデータ持ってこないとテストできないですよね。
そのためのテストデータを読み込むための前準備のやり方が書かれています。
具体的には先程のsfTestFunctionalクラスを継承した独自の機能テストクラスを作成します。
その後、sfTestFunctionalを使用していた部分を独自の機能テストクラス(JobeetTestFunctional)をインスタンス化してテストを行います。
テスト内容としてResponseに対してcheckElementメソッドを使用して表示内容の確認も行えます。

ただ、ここで問題が。。。
jobモジュールのテストjobActionsTestを実行したところ独自の機能テストクラス(JobeetTestFunctional)がnot Foundになってします。
要はクラスが見えてないだけだからrequire_onceしてやれば普通に動きます。
さんざんtwitterで愚痴を言った後にチュートリアルよく見るとJobeetTestFunctionalのコードが以下のようになってました。
// lib/test/JobeetTestFunctional.class.php
class JobeetTestFunctional extends sfTestFunctional
{
public function loadData()
{
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');

return $this;
}
}
1行目のコメントをよく見るとlibフォルダの下に置くようになっていました。
昨日からずっとtestフォルダの下で作業していたのでよく見ずtestフォルダの下にJobeetTestFunctionalを作ってしまいそりゃ見えないよって感じになってました。
(symfonyはlibやapp/libなどlibフォルダの下にクラスを配置すると自動的にロードされます。)

で、無事サンプルのテストケースが動いたのでこの後2日目に書かれていた要件にそったテストケースを追加していく。
途中テストコードのリファクタリングの仕方などがあり、無事実装完了。

今回はチュートリアル通りコードを書いてるので特に問題無いのですが実際使用する際はResponseの情報がないとなんでエラーなのか分からない時があると思います。
そんな時は以下のコード使用することでResponseの内容を表示出来ます。
$browser->with('response')->debug();
チュートリアルのそってjobモジュールとcategoryモジュールのテスト作成したのですが、以下のコマンドでまとめてテストすることが可能です。
$ php symfony test:functional frontend
さらに前回作成したユニットテストもまとめてテストするには以下のコマンドで可能です。
1つのテストクラスが1つのテストスイートって感じですね。
$ php symfony test:all

毎回毎回、テストケース全部通すのはめんどくさいので"--only-failed"という便利なオプションも用意されています。
これは前回通らなかったテストのみ強制実行するオプションです。
試しにcategoryActionsでエラーが発生するように修正してテストを実行します。
その後、テストが通るように再度修正し、"--only-failed"オプションを付けて実行するとエラーだったテストケースのみが実行されます。
その状態で再度テストを実行すると全テストケースが実行されます。
(イマイチ説明が下手だな)
とにかく、"--only-failed"は便利!!
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
RSSリンクの表示
last.fm
twitter
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。