CodingFirst

C言語、Perl、JavaScript、最近はPythonも。出来上がったものより、プログラムを書くことが好き。あと、スイーツ。

スポンサーサイト

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MinUnitでテストしたその後

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

前にxUnit系のテストとしてMinUnitとそれを改造したMacroUnitについて書いた。
あれから半年以上経って、試行錯誤した結果、もうちょっと違うのがいいなーと思い
今回、munitというのを作った。
前に書いた記事→http://d.hatena.ne.jp/yukioc/20100604/1275657911

xUnit系テストを、CUnit、MinUnit、MacroUnitと経て使ってきたけど、
共通して思うのは書いたコードを関数レベルで試すのに向いてるなということ。
それとテストを書きやすい関数を書く癖がついて、汎用的に、依存関係を少なく
設計する事に繋がるので良いなぁとも思った。

しかし、後からテストを追加する、品質向上的な使い方には向いてないと考えてる。
バグが見つかったらその環境でデバッグするんだけど、
わざわざxUnitで再現環境を作ってデバッグしない。
修正したら既存のテストを実行するけど、
その際に今回用のテストを追加するのは一手間余分に感じる。
やってはみたけど、そんな不具合に限ってxUnitでテストしづらくて
時間がかかったりした。たぶん、xUnitは不向きで、
別の方法があるんだと思う。
良いアイデアないけど、たぶんそう。

ところで、MacroUnitは、CUnit相当の事ができてソースは
短いのでベストと思ってたんだけど、使ってるとしっくりこない。
どうもsuiteがいけない。
suiteが入ることでテストに計画性を考えだすが、
自分用のツールなんてそもそも無計画なのでモヤっと。

そういうわけで、実装を見直した。一応、名前もmunitに変えた。
http://gist.github.com/236001#file_munit.c

#ifndef __munit_h__
#define __munit_h__
#include 
#define mu_failed(file,line,expr) printf( "%s:%u: failed assertion `%s'\n",file,line,expr)
#define mu_tested(test,passed) printf( "Test: %-10s ... %s\n",test,(passed)?"passed":"FAILED")
#define mu_assert(expr) do{mu_nassert++;if(!(expr)){++mu_nfail;mu_failed(__FILE__,__LINE__,#expr);}}while(0)
#define mu_run_test(test) do{int f=mu_nfail;++mu_ntest;test();mu_tested(#test,(f==mu_nfail));}while(0)
#define mu_show_failures() do{printf("### Failed %d of %d asserts (%d tests).\n",mu_nfail,mu_nassert,mu_ntest);}while(0)
extern int mu_nfail;
extern int mu_ntest;
extern int mu_nassert;
#endif /* __munit_h__ */

int mu_nfail=0;
int mu_ntest=0;
int mu_nassert=0;

static void test_foo(){
  int foo=7;
  mu_assert(foo==7);
  mu_assert(foo==0||foo==7);
}

static void test_bar() {
  int bar=4,fail=4;
  mu_assert(bar==4);
  mu_assert(fail==5);
}

static void test_hoge() {
  int hoge=7;
  mu_assert(hoge==7);
}

static void test_fuga() {
  int fuga=7;
  mu_assert(fuga==7);
}

int main(int argc, char **argv) {
  mu_run_test(test_foo);
  mu_run_test(test_bar);
  mu_run_test(test_hoge);
  mu_run_test(test_fuga);
  mu_show_failures();
  return mu_nfail==0;
}

実行結果。

$ gcc munit.c && ./a.out 
Test: test_foo   ... passed
munit.c:27: failed assertion `fail==5'
Test: test_bar   ... FAILED
Test: test_hoge  ... passed
Test: test_fuga  ... passed
### Failed 1 of 6 asserts (4 tests).
スポンサーサイト


★☆★コメント★☆★

承認待ちコメント

このコメントは管理者の承認待ちです

コメントの投稿

Name
Subject
Mail
URI
Comment
Pass
Secret 管理者にだけ表示を許可する

トラックバック

http://iyukki.blog56.fc2.com/tb.php/104-d0515bf7

 | HOME | 

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。