| Cutterリファレンスマニュアル | ||||
|---|---|---|---|---|
| Top | 説明 | ||||
void setup (void); void cut_setup (void); void teardown (void); void cut_teardown (void); void cut_startup (void); void cut_shutdown (void); #define cut_add_data (first_data_name, ...) #define cut_add_data_backward_compatibility (context, ...) #define cut_set_attributes (first_attribute_name, ...) #define cut_get_current_test_context () #define cut_set_current_test_context (test_context) void cut_set_message (const char *format, ...); void cut_set_message_va_list (const char *format, va_list args); void cut_keep_message (void);
Cutterは以下のような特徴をもったC言語用の単体テストフレームワークです。
簡単に使えます。Cutterではテストプログラム中にCUTTER_DEFINE_TEST_STARTやCUTTER_DEFINE_TEST_ENDなどといった不思議なマクロを使う必要がありません。通常のプログラムと同じようにテストプログラムを書くことができます。ただし、プログラムが期待した通り動作していることを検証するためにcut_assert_XXX()を使う必要があります。
#include <cutter.h>
#include "my-stack.h"
void
test_my_stack (void)
{
MyStack *stack = my_stack_new();
cut_assert_not_null(stack);
cut_assert(my_stack_is_empty(stack));
cut_assert_equal_int(0, my_stack_get_size(stack));
my_stack_push(stack, 10);
cut_assert(!my_stack_is_empty(stack));
cut_assert_equal_int(1, my_stack_get_size(stack));
my_stack_push(stack, 20);
cut_assert_equal_int(2, my_stack_get_size(stack));
cut_assert_equal(20, my_stack_pop(stack));
cut_assert(!my_stack_is_empty(stack));
cut_assert_equal_int(1, my_stack_get_size(stack));
cut_assert_equal(10, my_stack_pop(stack));
cut_assert(my_stack_is_empty(stack));
cut_assert_equal_int(0, my_stack_get_size(stack));
}
簡素ですが有用な情報を出力をします。Cutterはデフォルトではテストが問題なく動いているときは静かに動きます。以下は、Cutter自身のテストの出力です。
........................................................... Finished in 0.213021 seconds 59 test(s), 246 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 notification(s)
Cutterはテストが1つパスしたことを示すためには「.」だけを出力し、最後にテスト結果の要約を出力します。Cutterは各テストの名前や何個検証したかなどの情報は表示しません。これは、テスト成功時にはこれらの情報は必要ないからです。
Cutterは失敗時にはたくさんの情報を出力します。
.....................F..................................... 1) Failure: test_error <"Strange" == cut_test_result_get_test_name(result)> expected: <Strange!!!> but was: <dummy-error-test> test/test-cut-assertions.c:240: cut_assert_test_result() Finished in 0.223657 seconds 59 test(s), 242 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 notification(s)
上記の結果はCutterの自己テストにおかしな期待値を追加したために起きています。
cut_assert_equal_string("Strange!!!", cut_test_result_get_test_name(result));
おかしな検証はtest/test-cut-assertions.cの240行目に書かれていて、その行はcut_assert_test_result()関数内にあります。この関数はtest_errorテストから呼び出されています。cut_test_result_get_test_name(result)が"Strange!!!"を返すことを期待していますが、実際は"dummy-error-name"が返ってきています。このような情報を上記のCutterの出力から得ることができます。これはデバッグの手助けになるでしょう。
Cutterの出力形式は実用的です。' but was:'はその上の'expected:'と並ぶようにインデントされています。これは期待値と実測値をパッと見て簡単に比較できるようにするためです。問題のあった行は「ファイル名:行: 関数」というように整形されています。これはEmacsと連携するためです。Emacsのcompilation-modeではこの形式が*compilation*バッファに表れると、next-errorコマンド(C-x `)で「ファイル名」の「行」へジャンプすることができます。これは問題行を素早く見つける手助けをします。
Cutterは簡単にテストを書くことを支援するだけではなく、簡単にデバッグをできることも支援します。
void setup (void);
setupはバージョン1.0.7から非推奨になりました。新しく書くコードでは使わないでください。代わりにcut_setup()を使ってください。
テストプログラム中でsetup()を定義していたら、cutterは各テストが実行される前に定義されたsetup()を呼びだします。cut_setup()が定義されていた場合は、setup()は無視されます。
void cut_setup (void);
テストプログラム中でcut_setup()を定義していたら、cutterは各テストが実行される前に定義されたcut_setup()を呼びだします。cut_setup()とsetup()が定義されていた場合はcut_setup()だけが使われます。
1.0.6から
void teardown (void);
teardownはバージョン1.0.7から非推奨になりました。新しく書くコードでは使わないでください。代わりにcut_teardown()を使ってください。
テストプログラム中でteardown()を定義していたら、cutterは各テストの後に、たとえテストが失敗していた時でも、teardown()を呼びだします。cut_teardown()が定義されていた場合は、teardown()は無視されます。
void cut_teardown (void);
テストプログラム中でcut_teardown()を定義していたら、cutterは各テストの後に、たとえテストが失敗していた時でも、cut_teardown()を呼びだします。cut_teardown()とteardown()が定義されていた場合はcut_teardown()だけが使われます。
1.0.6から
void cut_startup (void);
テストプログラム中でcut_startup()を定義していたら、cutterは各テストケースが実行される前に定義されたcut_startup()を呼びだします。cut_startup()とstartup()が定義されていた場合はcut_startup()だけが使われます。
1.0.6から
void cut_shutdown (void);
テストプログラム中でshutdown()を定義していたら、cutterは各テストケースが実行された後に定義されたshutdown()を呼びだします。cut_shutdown()とshutdown()が定義されていた場合はcut_shutdown()だけが使われます。
1.0.6から
#define cut_add_data(first_data_name, ...)
データ駆動テストで使うデータを追加します。
例:
#include <cutter.h>
void data_translate (void);
void test_translate (const void *data);
static const char*
translate (int input)
{
switch(input) {
case 1:
return "first";
case 111:
return "a hundred eleven";
default:
return "unsupported";
}
}
typedef struct _TranslateTestData
{
char *translated;
int input;
} TranslateTestData;
static TranslateTestData *
translate_test_data_new (char *translated, int input)
{
TranslateTestData *data;
data = malloc(sizeof(TranslateTestData));
data->translated = strdup(translated);
data->input = input;
return data;
}
static void
translate_test_data_free (TranslateTestData *data)
{
free(data->translated);
free(data);
}
void
data_translate(void)
{
cut_add_data("simple data",
translate_test_data_new("first", 1),
translate_test_data_free,
"complex data",
translate_test_data_new("a hundred eleven", 111),
translate_test_data_free,
NULL);
}
void
test_translate(const void *data)
{
const TranslateTestData *test_data = data;
cut_assert_equal_string(test_data->translated,
translate(test_data->input));
}
|
最初のデータ名。 |
|
最初のデータとデータ破棄関数。続けて任意の数の「名前・データ・データ破棄関数(CutDestroyFunction)」の三つ組を指定します。1.0.6から可変長の引数はNULL終端しなければいけなくなりました。 |
1.0.3から
#define cut_add_data_backward_compatibility(context, ...)
cut_add_data_backward_compatibilityは非推奨です。新しいコードでは使わないでください。
|
|
|
#define cut_set_attributes(first_attribute_name, ...)
テストの属性を設定します。
例:
#include <cutter.h>
void attributes_repeat (void);
void test_repeat (void);
void
attributes_repeat(void)
{
cut_set_attributes("description", "a test for repeat function",
"bug", "111",
"priority", "high",
NULL);
}
void
test_repeat(void)
{
cut_assert_equal_string_with_free("XXX", repeat("X", 3));
}
|
最初の属性名。 |
|
最初の属性値です。その後に任意個数の名前と値のペアが続きます。1.0.7からNULL終端が必須になりました。 |
1.0.4から
#define cut_get_current_test_context()
現在のテストコンテキストを返します。「現在のテストコンテキスト」はスレッドローカルなオブジェクトです。もしテストの中で新しいスレッドを作らない場合はテストコンテキストを気にする必要はありません。新しいスレッドを作る場合だけ必要になります。テストのスレッドが持っている「現在のテストコンテキスト」を新しく作ったスレッドに渡す必要がありません。
例:
int
your_thread_function(void *data)
{
CutTestContext *test_context = data;
cut_set_current_test_context(test_context);
...
}
void
run_your_thread(void)
{
int result;
pthread_t your_thread;
result = pthread_create(&your_thread, NULL,
your_thread_function,
cut_get_current_test_context());
...
}
戻り値 : |
CutTestContextオブジェクト。 |
1.0.4から
#define cut_set_current_test_context(test_context)
現在のテストコンテキストをtest_contextにします。詳細はcut_get_current_test_context()を見てください。
|
現在のテストコンテキストになるCutTestContext。 |
1.0.4から
void cut_set_message (const char *format,
...);
次の検証で使われるメッセージです。
|
整形文字列。printf()のドキュメントを見てください。 |
|
整形文字列に挿入されるパラメータ。 |
1.0.6から
void cut_set_message_va_list (const char *format,
va_list args);
次の検証で使われるメッセージです。
|
整形文字列。printf()のドキュメントを見てください。 |
|
整形文字列に挿入されるパラメータ。 |
1.0.6から
void cut_keep_message (void);
cut_set_message()またはcut_set_message_va_list()で設定した現在のメッセージを次の検証の後でも維持します。
1.0.6から