忍者ブログ

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

テスト結果は以下のようになります。
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

実行結果は以下のようになります。
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の機能をもとにカバレッジを測定します。
Tagクラスのカバレッジ測定

PR

この記事にコメントする

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック

この記事にトラックバックする:

sfSiteStructurePlugin:サイトマップとパンくずリストの自動生成 HOME askeet day sixteen: Lazy day の解説

プロフィール

HN:
flyfront
性別:
非公開
自己紹介:
PHPプログラマ。東京でsymfonyな仕事してます。

HNはflyfrontですが、
仕事関係ではr_koike名義を使ってる場合もあります。

Wassr

カレンダー

09 2017/10 11
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

最新コメント

[01/02 通りすがり]
[10/18 flyfront]

バーコード

アクセス解析

忍者ブログ [PR]
Template by repe