新しく採用されたテスティングフレームワークlimeの紹介 – lime without symfony part 1

symfony1.0.0からSimpleTestに替わってlimeという新しいテスティングフレームワークが採用されました。pakeと同じようにsymfonyプロジェクトのサブプロダクト的な扱いのようです。

本家サイトから可能な限り情報を集めようとしましたが、つまりはsymfony本体のテストを読めという事でしたので手探り状態で調べています。limesymfonyで利用する事を主目的とされているようですが、もちろん単体でも利用できます。今日はlimeの手始めとして「lime without symfony」と題しpureなlimeを体験してみます。

実験環境のセットアップ

まず適当な場所に実験環境を作ります。

mkdir lime-trial
cd lime-trial

Subversionのリポジトリからチェックアウトしてきます。

svn checkout http://svn.symfony-project.com/tools/lime

最も簡単な例

以下のようなコードをhello-world.phpという名前でlime-trialの直下におきます。

require_once("./lime/lib/lime.php");
$t = new lime_test;
$t->ok(true,"hello world");

以下のようにしてテストを実行します。

php hello-world.php

すると実行結果は以下のようになります。

難しくありませんね。lime_testのok関数は第1引数に条件とり第2引数にメッセージをとります。次は複数のテストで片一方を失敗させてみましょう。

require_once("./lime/lib/lime.php");
$t = new lime_test;
$t->ok(true,"may be sccess");	
$t->ok(false,"may be error");

結果は以下のようになります。

lime_testクラス

上の簡単な例で使ったlime_testクラスはlimeテスティングフレームワークの中心となるクラスです。

lime_testオブジェクトの構築

lime_testのコンストラクタは2つの引数を持つ事ができます。1つ目は計画しているテストの数、2つ目は表示出力用オブジェクトです。 1つ目の計画しているテストの数は実行する予定のテストの数を表します。デフォルトはnullで「未設定」の状態です。テストの実行計画数を設定すると、実際に実行されたテストの数が一致しなかった場合以下のようなエラーが報告されますす。

2つ目の引数はレポート出力時の方法を示します。

$t = new lime_test(1,new lime_output_color);

としてlime_testの構築時にlime_output_colorのオブジェクトを渡す事で出力が以下のように派手になります。

デフォルトではlime_output_colorの継承元であるlime_outputが使われるので今の所ここに書くべきものはlime_output_colorのみのようです。これ以降、特に理由がなければlime_output_colorを使っていきたいと思います。

lime_testクラスのパブリックメソッド

lime_testクラスはテストをする上での最も基本的な役割を果たします。

判定(テスト)メソッド

lime_testクラスを理解する為に、lime_testクラスのpublicメソッドを調べてみます。

  function ok($exp, $message = '')
  function is($exp1, $exp2, $message = '')
  function isnt($exp1, $exp2, $message = '')
  function like($exp, $regex, $message = '')
  function unlike($exp, $regex, $message = '')
  function cmp_ok($exp1, $op, $exp2, $message = '')
  function can_ok($object, $methods, $message = '')
  function isa_ok($var, $class, $message = '')
  function is_deeply($exp1, $exp2, $message = '')

どのメソッドにも最後の引数に$messageがついています。$messageを指定する事でそれぞれのテストの結果を表示する時にこの$messageを表示します。

function ok($exp, $message = ”)

先程、hello-world.phpで用いた一番シンプルなテストメソッドです。$expがfalseならエラーを出力します。

function is($exp1, $exp2, $message = ”)

$exp1と$exp2が同じかどうかを調べます。 例

<?php
$t = new lime_test(1,new lime_output_color);
$t->is(false, false);

結果は以下のようになります。

ok 1
1..1

function isnt($exp1, $exp2, $message = ”)

isと逆に$exp1と$exp2が同じであればエラーとなります。

function like($exp, $regex, $message = ”)

$exp(文字列)が$regexの正規表現にマッチするかを判定します。$regexにはpreg_matchで利用する正規表現を指定します。

function unlike($exp, $regex, $message = ”)

lineの逆に$exp(文字列)が$regexの正規表現にマッチしないかを判定します。

function cmp_ok($exp1, $op, $exp2, $message = ”)

$exp1と$exp2の関係が$opであるかを判定します。 $opにはPHPの比較演算子を指定します。

function can_ok($object, $methods, $message = ”)

$objectに$methodsが存在するかを判定します。

function isa_ok($var, $class, $message = ”)

$varが$classのインスタンスであるかを調べます。

function is_deeply($exp1, $exp2, $message = ”)

$exp1と$exp2が同じであるかを調べます。isとの違いは連想配列の要素をすべて末端まで比較します。

function include_ok($file, $message = ”)

$file がincludeできるかを調べます。

無条件で判定結果を返すメソッド

以下の2つは無条件です。

function pass($message = '')
function fail($message = '')

function pass($message = ”)

判定結果が合格だった事にします。

function fail($message = ”)

判定結果が不合格だった事にします。

 表示用メソッド

  function diag($message)
  function skip($message = '', $nb_tests = 1)
  function todo($message = '')
  function comment($message)

上記のいずれもメッセージを表示するための物です。

<?php
require_once("lime/lib/lime.php");
$t = new lime_test(2,new lime_output_color);
$t->diag("this is a diag output");
$t->skip("this is a skip output");
$t->todo("this is a todo output");
$t->comment("this is a coment output");

この結果は以下のようになります。


本日は最も簡単なlimeの基本部分だけをなぞってみました。limeを使ってみた感想はとても実装がシンプルであるという事です。テストケースを書く時にクラスを書かずにスクリプトから書き始められます。limeはlime.phpだけあれば機能するテストユーティリティですのでsymfonyと一緒でなくても十分便利に利用できます。次回はlimeをObserveするクラスを紹介していきたいと思います。

lime without symfony シリーズ

  1. 新しく採用されたテスティングフレームワークの紹介
  2. 複数のテストファイルをまとめてテスト
  3. テストは十分?

One Response to “新しく採用されたテスティングフレームワークlimeの紹介 – lime without symfony part 1”

1
oge - 12/12/06

まんま、perlっすね。

Leave a Reply

You must be logged in to post a comment.