昨日はメソッド一つずつが正しく動作するかどうかという単体テストを行ったみたいですが、今日は機能テストを行います。
単に機能テストというと幅が広いですが、Webアプリの場合はリンクが正しいか、フォームに変な値を入れても大丈夫か、といったブラウザ上で正しく動くかどうかのテストが中心となります。
Webアプリを作成するときは必ずフォームに「'or 1 -- 」を入力してみるといったテストを行うことになりますが、はっきりいって面倒です。
機能テストを書くことで、そこらへんを自動的にやってくれるようになります。
まずtest/functional/frontend/ディレクトリを見てみると、知らない間にjobActionsTest.phpとcategoryActionsTest.phpが出来ています。
モジュールを作成したときに、ついでに作成されたものです。
categoryActionsTest.phpを見てみると、/category/indexにアクセスするとcategoryモジュールのindexアクションが実行され、200のステータスコードが返ってくるはずだよ、的なことが書かれています。
実際http://symfony.localhost/frontend_dev.php/category/indexにアクセスすると404エラーになるので、このテストも失敗します。
>php test/functional/frontend/categoryActionsTest.php
# get /category/index
ok 1 - request parameter module is category
not ok 2 - request parameter action is index
# Failed test (test\sfTesterRequest.class.php at line 48)
# got: 'show'
# expected: 'index'
not ok 3 - status code is 200
# Failed test (test\sfTesterResponse.class.php at line 257)
# got: 404
# expected: 200
ok 4 - response selector body does not match regex /This is a temporary page/
1..4
Looks like you failed 2 tests of 4.
indexアクションが実行されるって書いてあるのに実際はshowアクションが起動するよ、ステータス200が返ってくるはずなのに404が返ってくるよ、という二つのエラーが返ってきました。
正しいカテゴリページはこんなかんじで、
http://symfony.localhost/frontend_dev.php/category/programming
実行されるアクションもcategoryActions::executeShow()なので動作テストの一部を現状に合わせて書き換えます。
test/functional/frontend/categoryActionsTest.php
>php test/functional/frontend/categoryActionsTest.php
# get /category/programming
ok 1 - request parameter module is category
ok 2 - request parameter action is show
ok 3 - status code is 200
ok 4 - response selector body does not match regex /This is a temporary page/
1..4
Looks like everything went fine.
想定通りになりました。
ちなみに4行目は、本文中に「This is a temporary page」が入っていないかどうかをチェックしてOKだった、という意味です。
これからデータベースと接続を行うみたいなのですが、このJobeetTestFunctionalクラスの意味がわかりません。
何故かこのファイルだけtestディレクトリではなくlibディレクトリ内に設置しないといけないので気をつけましょう。
lib/test/JobeetTestFunctional.class.php
次は用意されていたjobActionsTest.phpを書き換えてみます。
test/functional/frontend/jobActionsTest.php
何処にもinclude()とか書いてないのに何で勝手にlib/test/JobeetTestFunctional.class.phpが呼び出されるんでしょうね。
今回は'/'でアクセスした場合jobモジュールのindexアクションが呼び出され、出力されたHTML内に'.jobs td.position:contains("expired")'セレクタが存在しない、というチェックを行っています。
何れも正しいのでテストは成功します。
適当に存在するセレクタ、'.category .feed a'とかを入れてみると発見されてしまいエラーになります。
ところで':contains'って何なんだ?
CSS3には見あたらないんですが。
ヘルプにはそもそも何も無し。
どうにもこうにも。
単に機能テストというと幅が広いですが、Webアプリの場合はリンクが正しいか、フォームに変な値を入れても大丈夫か、といったブラウザ上で正しく動くかどうかのテストが中心となります。
Webアプリを作成するときは必ずフォームに「'or 1 -- 」を入力してみるといったテストを行うことになりますが、はっきりいって面倒です。
機能テストを書くことで、そこらへんを自動的にやってくれるようになります。
まずtest/functional/frontend/ディレクトリを見てみると、知らない間にjobActionsTest.phpとcategoryActionsTest.phpが出来ています。
モジュールを作成したときに、ついでに作成されたものです。
categoryActionsTest.phpを見てみると、/category/indexにアクセスするとcategoryモジュールのindexアクションが実行され、200のステータスコードが返ってくるはずだよ、的なことが書かれています。
実際http://symfony.localhost/frontend_dev.php/category/indexにアクセスすると404エラーになるので、このテストも失敗します。
>php test/functional/frontend/categoryActionsTest.php
# get /category/index
ok 1 - request parameter module is category
not ok 2 - request parameter action is index
# Failed test (test\sfTesterRequest.class.php at line 48)
# got: 'show'
# expected: 'index'
not ok 3 - status code is 200
# Failed test (test\sfTesterResponse.class.php at line 257)
# got: 404
# expected: 200
ok 4 - response selector body does not match regex /This is a temporary page/
1..4
Looks like you failed 2 tests of 4.
indexアクションが実行されるって書いてあるのに実際はshowアクションが起動するよ、ステータス200が返ってくるはずなのに404が返ってくるよ、という二つのエラーが返ってきました。
正しいカテゴリページはこんなかんじで、
http://symfony.localhost/frontend_dev.php/category/programming
実行されるアクションもcategoryActions::executeShow()なので動作テストの一部を現状に合わせて書き換えます。
test/functional/frontend/categoryActionsTest.php
1
2
3
4
5
|
get('/category/programming')->
with('request')->begin()->
isParameter('module', 'category')->
isParameter('action', 'show')->
end()
|
>php test/functional/frontend/categoryActionsTest.php
# get /category/programming
ok 1 - request parameter module is category
ok 2 - request parameter action is show
ok 3 - status code is 200
ok 4 - response selector body does not match regex /This is a temporary page/
1..4
Looks like everything went fine.
想定通りになりました。
ちなみに4行目は、本文中に「This is a temporary page」が入っていないかどうかをチェックしてOKだった、という意味です。
これからデータベースと接続を行うみたいなのですが、このJobeetTestFunctionalクラスの意味がわかりません。
何故かこのファイルだけtestディレクトリではなくlibディレクトリ内に設置しないといけないので気をつけましょう。
lib/test/JobeetTestFunctional.class.php
1
2
3
4
5
6
|
class JobeetTestFunctional extends sfTestFunctional{
public function loadData(){
Doctrine::loadData(sfConfig::get('sf_test_dir').'/fixtures');
return $this;
}
}
|
次は用意されていたjobActionsTest.phpを書き換えてみます。
test/functional/frontend/jobActionsTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new JobeetTestFunctional(new sfBrowser());
$browser->loadData();
$browser->info('1 - The homepage')->
get('/')->
with('request')->begin()->
isParameter('module', 'job')->
isParameter('action', 'index')->
end()->
with('response')->begin()->
info(' 1.1 - Expired jobs are not listed')->
checkElement('.jobs td.position:contains("expired")', false)->
end()
;
|
何処にもinclude()とか書いてないのに何で勝手にlib/test/JobeetTestFunctional.class.phpが呼び出されるんでしょうね。
今回は'/'でアクセスした場合jobモジュールのindexアクションが呼び出され、出力されたHTML内に'.jobs td.position:contains("expired")'セレクタが存在しない、というチェックを行っています。
何れも正しいのでテストは成功します。
適当に存在するセレクタ、'.category .feed a'とかを入れてみると発見されてしまいエラーになります。
ところで':contains'って何なんだ?
CSS3には見あたらないんですが。
ヘルプにはそもそも何も無し。
どうにもこうにも。
PR
トラックバック
トラックバックURL: