昨年の10月から開発しているCutterというC言語用の単体テストフレームワークのバージョン1.0が昨日リリースされました。
フリーソフトウェアの世界には簡単にテストを書けるC言語用の単体フレームワークがそれまではありませんでした。例えば、GLibに含まれているGTesterでは以下のようにmain関数を定義してその中で実行したいテストを一つずつ登録しなくてはいけません。
GLibのtests/testingbase64.cから抜粋:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
static void test_base64_encode_decode (void) { ... } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_add_func ("/misc/base64/decode", test_base64_decode); return g_test_run (); } |
Cutterではこのような冗長な記述をさけるため以下のようなルールでテストが書かれていることを仮定しています。
このようなルールを定めることによって、main関数を書く必要がなく、テストを登録する関数も呼ぶ必要がないために、より楽にテストを書けるようになっています。
Cutterでは上記のテストは以下のように書くだけですみます。
1 2 3 4 5 6 7 |
void test_base64_encode_decode (void); /* prototype */ void test_base64_encode_decode (void) { ... } |
テスト関数はダイナミックリンクライブラリとして読み込まれて実行される必要があるのでstaticな関数ではなくなってプロトタイプ宣言を書く必要がありますが、それでもGTesterに比べて簡潔に書けるようになっています。
Cutterではその他にもアサート文が充実してることなど他の単体テストフレームワークよりもかなり使いやすくなっています。Cでテストを書かなくてはいけなくなった時にはぜひ使ってみてください。
Rubyで実装されたSubversion用*1リポジトリブラウザ(兼ITS(Issue Tracking System)/BTS(Bug Tracking System))としてRetrospectivaがあります。
Retrospectivaにはコミットログを解析してより便利にRetrospectivaを使うための機能がいくつかあります。Retrospectivaを採用しているプロジェクトであれば、コミットログの書き方をRetrospectivaの解釈できる書き方にすることにより、さらにRetrospectivaを便利に使うことができます。
RetrospectivaはチケットベースのITS機能を備えています。コミットログには「XXX番のチケットの問題を修正した」というようなログを書くことも多いでしょう。その時、以下のフォーマットでチケットの番号を書くことにより、そのコミットログをRetrospectiva上で見ると該当するチケットにリンクが張られます。(例)
[#XXX]
この機能はブラウザ上から変更履歴を見ているときにとても便利です。
RetrospectivaにはExtensionという拡張機能の仕組みがあります。この仕組みを利用したSCM Ticket Updateという拡張機能を導入することにより、コミットログでチケットの状態を更新することができます。
SCM Ticket Updateの導入方法は以下の通りです。(現時点(2008-05-23)のtrunkを利用している場合)
% RAILS_ENV=production ruby script/rxm checkout http://retrospectiva.googlecode.com/svn/extensions/1-1/scm_ticket_update % RAILS_ENV=production ruby script/rxm install scm_ticket_update % # Retrospectivaを再起動
拡張機能をインストールした場合はRetrospectivaを再起動することを忘れないでください。
この拡張機能を入れた後は以下のような書式でコミットログを書くことにより、コミットと一緒にチケットも更新することができます。
チケット#123の状態を修正済みに変更:
クラッシュバグを修正 [#123] (status:fixed)
チケット#29の割り当てユーザをaliceに変更:
[#29] テストを追加 (assigned:alice)
他にも以下のような書式が使えます。
[#N] (NAME1:VALUE1 NAME:VALUE2 ...) ログ
また、もし変更後の値に空白が入っている場合は「"..."」とダブルクォートで囲みます。
[#2929] (status:fixed milestone:"2.9 (バラ)") fix a trivial bug.
この機能を使うと、コミットした後にブラウザからチケットを変更する作業がなくなるのでチケットのクローズし忘れも減るかもしれません。また、コミットメールで(コミットログから)チケットがクローズされたことが分かるのも便利な点です。
このようにコミットログの書き方を少しRetrospectivaよりにするだけでもっと便利にRetrospectivaが使えるようになります。
Retrospectivaが要求している書き方を使ってもコミットログが見づらくなるわけではないので、少し意識して使ってみてはいかがでしょうか。
*1 Gitにも微妙に対応している