CodingFirst

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

スポンサーサイト

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

MinUnitでテストしてみる

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

C言語でお手軽にテストしたい(その4)

CUnit はちと面倒だったので、もっとお手軽なのを探したら、MinUnit を発見。試してみる。

JTN002 - MinUnit -- a minimal unit testing framework for C

特徴は、3行。

だから、ソースも簡単に読めるし、試すのも簡単。サイトにある minunit.h minunit_example.c をコピペなどして作成したら

$ gcc minunit_example.c && ./a.out
error, bar != 5
Tests run: 2

おしまい。。

用途によってはこれでいい。

でも、自分の用途としては少し足りないかな。

setup, teardown とかはなくていいけど、suiteとかtestとかのグルーピングは欲しくて、あと、printfももう少し情報欲しい。

MinUnitは行がすくないし、早速、アレンジしてみる。

#ifndef __macrounit_h__
#define __macrounit_h__
#define mu_prn_failed(file,line,expr) printf( "%s:%u: failed assertion `%s'\n",file,line,expr)
#define mu_prn_test(test,passed) printf( "  Test: %s ... %s\n",test,(passed)?"passed":"FAILED")
#define mu_prn_suite(suite) printf( "Suite: %s\n",suite)

#define mu_assert(file,line,expr) do { ++mu_asserts; if (!(expr)) { ++mu_failures; mu_prn_failed(file,line,#expr); }} while (0)
#define MU_ASSERT(expr) mu_assert(__FILE__,__LINE__,expr)

#define mu_run_test(test) do { int f=mu_failures; ++mu_tests; test(); mu_prn_test(#test,(f==mu_failures)); } while (0)
#define mu_run_suite(suite) do { ++mu_suites; mu_prn_suite(#suite); suite(); } while(0)
#define mu_show_failures() do { printf("### Failed %d of %d asserts (%d suites, %d tests).\n",mu_failures,mu_asserts,mu_suites,mu_tests); } while(0)
extern int mu_suites;
extern int mu_tests;
extern int mu_failures;
extern int mu_asserts;
#endif /* __macrounit_h__ */

ちょっと行増やし過ぎかな。。

MinUnitからの改造なので、MacroUnitと名前を微妙にかえといたけど、マクロ名とかは同じ感じのままにした。とりあえず、サンプル。

#include 
#include "macrounit.h"
int mu_suites = 0;
int mu_tests = 0;
int mu_asserts = 0;
int mu_failures = 0;

static void test_foo() {
        int foo = 7;
        MU_ASSERT(foo == 7);
}

static void test_bar() {
        int bar = 4;
        MU_ASSERT(bar == 4);
        MU_ASSERT(bar == 5);
}

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

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

static void suite_one() {
        mu_run_test(test_foo);
        mu_run_test(test_bar);
}

static void suite_two() {
        mu_run_test(test_hoge);
        mu_run_test(test_fuga);
}

int main(int argc, char **argv) {
        mu_run_suite(suite_one);
        mu_run_suite(suite_two);
        mu_show_failures();
        return mu_failures != 0;
}

で、実行。

$ gcc macrounit_example.c && ./a.out 
Suite: suite_one
  Test: test_foo ... passed
macrounit_example.c:20: failed assertion `bar == 5'
  Test: test_bar ... FAILED
Suite: suite_two
  Test: test_hoge ... passed
  Test: test_fuga ... passed
### Failed 1 of 5 asserts (2 suites, 4 tests).

まーまーいいんじゃないかな。

エラーの表示を assert()風にしたので、vimなどを使ってる際、便利だろう。

それにしてもな。。minunitと同じく、グローバル変数をどこかで定義しなきゃならんのは美しくない。

まぁ、こんくらいはいいとするか。

スポンサーサイト

 | HOME |  »

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

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