Feb 19

逆引きrhaco(?)18:doctestを使う

doctestは「PythonフレームワークのDjangoにはPythonはdoctestあって便利ー!」と聞かされてカッとなって作った(パクった)テストツールです(違ってたら修正よろしく〜)。

便利な点は
1.コードとテストが同じファイル内にある
2.ユニットテストにテストが書いてある場合、どのユニットテストを見れば良いか分かる
3.テスト書いてないかどうかも分かる
4.trunkではドキュメントと同時にテストも表示されて例文代わりになって便利!
5.trunkではテストをファイル単位、フォルダ単位で自由に選べる

この4点だと思います。
早速簡単なのを書いてみます。
適当にプロジェクトを作ってlibrary/Hoge.phpを作ったとして

<?php
class Hoge {
  var $fuga;
  /**
  * class hoge
  * これはjavadocやphpdocsです
  * @author shigepon
  */ 
  function Hoge($fuga){
  /***
  * $h = new Hoge('rhaco');
  * eq('rhaco',$h->fuga);
  * neq('conveyor',$h->fuga);
  * neq('shigepon',$h->fuga,'テスト結果の欄にコメントを付けれますよ');
  * assert(isset($o->fuga));
  * //これはdoctestなので、コメントは//とか付けます
  */
    $this->fuga = $fuga;
  }

  function foo(){
  /*** #pass */
  //テストを「飛ばしたよ」と明示する場合
  }

  function bar(){
  //doctestを書かないとNONEと結果に表示されます。
  }

}
?>

という感じで書きます。doctestを行う手順は

1.setup.phpにアクセスする
2.上部の「test」リンクをクリックする。
これだけです。

さらに、
3.上部に実行するファイル、フォルダを選択できるコンボボックスがあるので、選択
4.executeボタンをクリック
で、指定したファイル、フォルダのテストが可能です。

使えるメソッドは
eq(予想する値,実際の値,表示するコメント)→予想値と等しければtrue
neq(予想する値,実際の値,表示するコメント)→予想値と等しくなければtrue
assert(実際の値,表示するコメント) →値がtrueならばtrue
(追記)unit(ユニットテストのファイルパス)→ユニットテストを行う。ユニットテストは逆引きrhaco15を参考にして下さい。
3種4種です。

(追記)また/*** #pass */と書くことで「テストしない」と明示することが出来ます。何も書いてない場合は「NONE」と判断されます。これによって「あえて飛ばしているか」「書いてないか」を判断できます。

rhacoでは気軽にテストを書けるので「転ばぬ先の杖」的に書いておけば幸せになれるかもしれません。

ちなみにRhaco自身のテスト内容はsetup.phpのrhacodocリンク、またテスト結果はRhacoフォルダ/_testapp/setup.phpのtestリンクから見ることが出来ますが、
非常にたくさんnoneや/*** #pass */が書いてあります。

(追記2009/01/30)rhacoのバージョンが上がってrhaco本体のテストはrhaco本体から分離しました。現在rhaco本体のテストはhttp://rhaco.googlecode.com/svn/rhaco_1_x/test内に各種バージョンのものがあります。現在最新のものはhttp://rhaco.googlecode.com/svn/rhaco_1_x/test/1_6_1です。チェックアウトして、通常のアプリのようにセットアップ後、セットアップ画面のtestからテストできます。

noneや/*** #pass */の箇所を埋めてもいーよーと思う人は是非、lingrのrhaco-jaページなどで「テスト書くよ!」と言って下さい。

| comment(2)