uthorofotus iruc
プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」
[32] [31] [30] [29] [28] [27] [26] [25] [24] [23]
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
symfony:テストフレームワークLimeを使った単体テスト
symfonyで使われているテスト用フレームワークのLimeを使い、askeetチュートリアル15日目の単体テストを実行するようにしました。
今のsymfony(1.0.1)は独自テストフレームワークのLimeを使っているのにも関わらず、チュートリアル中ではSimpleTestを使っています。
Limeでのテストを作るにあたって、Symfonyで開発日記さんのブログ記事が分かりやすかったので、そちらを参考にしました。
Limeのさらに詳しい情報は、symfony Booksのテスト章やwikiを見てください。
■Tagクラスの単体テスト
1クラスのテストの対してテストを1ファイルにまとめると、沢山のメソッドがあったばあいに1ファイル内のコード量が増え、見通しが悪くなってしまいそうです。そこで、1メソッドのテストを1ファイルにまとめることにします。test/unit/tag というディレクトリをつくり、そこに各メソッドのテストファイルを置くことにします。
▽normalizeメソッドのテスト
test/unit/tag/normalizeTest.php を以下のように作ります。なお、Limeクラスファイルはunit.php内ですでに読み込まれています。unit.phpは test/bootstrap/ にあり、ここには単体テスト(unit.php)、機能テスト(function.php)をする前に読み込む設定ファイル置き場です。もしSimpleTestなど、他のテストフレームワークを使うのであればそこで読み込ませると良いでしょう。
<?php
include_once(dirname(__FILE__).'/../../bootstrap/unit.php');
require_once(SF_ROOT_DIR.'/lib/Tag.class.php');
#test data
$tests = array(
'FOO' => 'foo',
' foo' => 'foo',
'foo ' => 'foo',
' foo ' => 'foo',
'foo-bar' => 'foobar',
);
#lime config
$t = new lime_test(count($tests), new lime_output_color());
$t->diag('Tag::normalize');
#test execute: Tag::normalize
foreach ($tests as $tag => $normalized_tag)
{
$t->is(Tag::normalize($tag), $normalized_tag,
sprintf('Tag::normalize(%s) transforms %s',$tag,Tag::normalize($tag)));
}
?>
lime_testメソッドでは、テストの回数と出力フォーマットを指定します。diagメソッドはテスト出力にメッセージを出すためのメソッドで、テスト回数には含まれません。isメソッドは第一引数と第二引数が一致するかテストするメソッドです。第三引数はテスト結果に出力されるメッセージなので、変換前文字列と変換後文字列(期待する文字列ではない)を出力するようにしておきました。
テストの実行は以下のコマンドで行えます。なお、ディレクトリ指定(tag)はいりません。
symfony test-unit normalize
▽splitPhraseメソッドのテスト
normalizeと同様にsplitPhraseメソッドのテストを test/unit/tag/splitPhraseTest.php に作成します。
<?php
include_once(dirname(__FILE__).'/../../bootstrap/unit.php');
require_once(SF_ROOT_DIR.'/lib/Tag.class.php');
#test data
$tests = array(
'foo' => array('foo'),
'foo bar' => array('foo', 'bar'),
' foo bar ' => array('foo', 'bar'),
'"foo bar" askeet' => array('foo bar', 'askeet'),
"'foo bar' askeet" => array("'foo", "bar'", 'askeet'),
);
#もしエラーを出したいのであれば
# "'foo bar' askeet" => array('foo bar', 'askeet'),
#lime config
$t = new lime_test(count($tests), new lime_output_color());
$t->diag('Tag::splitPhrase');
#test execute: Tag::splitPhrase
foreach ($tests as $tag => $splited_tag)
{
$str = "{".implode(",",Tag::splitPhrase($tag))."}";
$t->is_deeply(Tag::splitPhrase($tag), $splited_tag,
sprintf('Tag::splitPhrase(%s) transforms %s',$tag,$str));
}
?>
テストの実行コマンドは以下の通りです。
symfony test-unit splitPhrase
▽Tagクラスのカバレッジ測定
Tagクラス内のソースコードのうち、何パーセントをテストで実行したかを測定します。もし、カバレッジのパーセンテージが低かったのなら、テスト出来てないコードが存在するということなので、すべてのコードをテストするようにテスト内容を修正した方が良いでしょう。
Limeでのカバレッジについては、Symfonyで開発日記さんのブログ記事を参考にしてテストを作成しました。
テスト内容は先ほど作ったテストファイルを利用することにします。カバレッジ測定用のテストファイルを test/unit/TagCaverageTest.php に作成します。
<?php
include_once(dirname(__FILE__).'/../bootstrap/unit.php');
$harness = new lime_harness(new lime_output_color());
#test/unit/tag にある各メソッドのテストファイルを読み込む
$harness->register("test/unit/tag");
$harness->run();
$coverage = new lime_coverage($harness);
$coverage->base_dir = realpath(SF_ROOT_DIR.'/lib/');
$coverage->register($coverage->base_dir.'/Tag.class.php');
$coverage->run();
?>
lime_harnessクラスを使い、複数のテストファイルをharness(まとめる)して実行します。実行後にlime_coverageクラスにlime_harnessインスタンス(テスト結果)と、テスト対象となるコードを登録します。lime_coverageクラスは、与えられたデータとxdebugの機能をもとにカバレッジを測定します。
この記事にコメントする
← sfSiteStructurePlugin:サイトマップとパンくずリストの自動生成 HOME askeet day sixteen: Lazy day の解説 →
プロフィール
Wassr
カレンダー
12 | 2025/01 | 02 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
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 | 31 |
最新記事
アクセス解析