検証作成の補助

検証作成の補助 — このセクションにあるシンボルは独自検証を作成することを補助します。

概要

void                cut_test_pass                       (void);
void                cut_test_fail                       (const char *system_message,
                                                         ...);
void                cut_test_fail_va_list               (const char *system_message,
                                                         const char *user_message_format);
#define             cut_trace                           (expression)
#define             cut_trace_with_info_expression      (expression,
                                                         info_expression)

説明

読みやすいテストを書くために独自の検証を作成する必要があるでしょう。このセクションのシンボルは独自の検証作成を補助します。

例:

my-assertions.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef __MY_ASSERTIONS_H__
#define __MY_ASSERTIONS_H__

#include <cutter.h>

#ifdef __cplusplus
extern "C" {
#endif

#define my_assert_equal_int(expected, actual)                    \
    cut_trace_with_info_expression(                              \
        my_assert_equal_int_helper((expected), (actual),         \
                                   # expected, # actual),        \
        my_assert_equal_int(expected, actual, __VA_ARGS__))

void my_assert_equal_int_help (long expected,
                               long actual,
                               const char *expression_expected,
                               const char *expression_actual);

#ifdef __cplusplus
}
#endif

#endif

my-assertions.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "my-assertions.h"

void
my_assert_equal_int_helper (long expected,
                            long actual,
                            const char *expression_expected,
                            const char *expression_actual)
{
    if (expected == actual) {
        cut_test_pass();
    } else {
        cut_test_fail(cut_take_printf("<%s == %s>\n"
                                      "expected: <%ld>\n"
                                      "  actual: <%ld>",
                                      expression_expected,
                                      expression_actual,
                                      expected, actual));
    }
}

Makefile.am:

1
2
3
4
5
AM_CFLAGS = $(CUTTER_CFLAGS)
LIBS = $(CUTTER_LIBS)
noinst_LTLIBRARIES = libmy-assertions.la
libmy_assertions_la_SOURCES = my-assertions.c my-assertions.h
AM_LDFLAGS = -module -rpath $(libdir) -avoid-version -no-undefined

詳細

cut_test_pass ()

void                cut_test_pass                       (void);

検証をパスしたらcut_test_pass()を呼んでください。cut_test_pass()は検証数を増やします。

1.0.5から


cut_test_fail ()

void                cut_test_fail                       (const char *system_message,
                                                         ...);

検証が失敗したらcut_test_fail()を呼んでください。cut_test_fail()は失敗数を増やし、現在のテストを中断します。

system_message :

テストフレームワーク指定の失敗メッセージ。

... :

省略可能な整形文字列。以降のパラメータが整形文字列に挿入されます。(printf()と同じ。)このパラメータは0.1.6から非推奨となっています。代わりにcut_set_message()を使ってください。

1.0.5から


cut_test_fail_va_list ()

void                cut_test_fail_va_list               (const char *system_message,
                                                         const char *user_message_format);

Warning

cut_test_fail_va_listはバージョン1.0.6から非推奨になりました。新しく書くコードでは使わないで下さい。代わりにcut_test_fail()を使ってください。

cut_test_fail_va_list()の動作についてはcut_test_fail()を見てください。user_message_formatは可変長引数の1つ前の引数です。

例:

1
2
3
4
5
6
7
8
9
10
11
void
my_assert(cut_boolean result,
          const gchar *user_message_format,
          ...)
{
    if (result) {
        cut_test_pass();
    } else {
        cut_test_fail_va_list("Fail!", user_message_format);
    }
}

system_message :

テストフレームワーク指定の失敗メッセージ。

user_message_format :

ユーザ指定の失敗メッセージ。

1.0.5から


cut_trace()

#define             cut_trace(expression)

現在のファイル名、行番号、関数名、expressionを記憶し、expression内で検証が失敗した場合に表示します。expressionの多くは関数呼び出しになるでしょう。

expressionの戻り値を取得できないことに注意してください。

cut_trace()は以下の通りです。もし、cut_assert_not_null(object)が失敗したら、バックトレースには2行含まれます。cut_assert_not_null(object)とcreate_my_object("my-name")です。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static MyObject *object;

static void
create_my_object(const char *name)
{
    object = my_object_new(name);
    cut_assert_not_null(object);
}

void
test_my_object_name(void)
{
    cut_trace(create_my_object("my-name"));
    cut_assert_equal_string("my-name",
                            my_object_get_name(object));
}

テストを読みやすくするためにcut_trace()を使ったマクロを書くかもしれません:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static MyObject *object;

static void
create_my_object_helper(const char *name)
{
    object = my_object_new(name);
    cut_assert_not_null(object);
}

#define create_my_object(...)                        \
    cut_trace(create_my_object_helper(__VA_ARGS__))

void
test_my_object_name(void)
{
    create_my_object("my-name");
    cut_assert_equal_string("my-name",
                            my_object_get_name(object));
}

expression :

呼び出されたことを記録される式。

1.0.5から


cut_trace_with_info_expression()

#define             cut_trace_with_info_expression(expression, info_expression)

cut_trace()cut_trace_with_info_expression()の違いは記録される式がexpressionと同じかどうかです。cut_trace_with_info_expression()はバックトレースの読みやすさのためにexpressionから情報を隠したいときに便利です。

cut_trace_with_info_expression()の例です。cut_assert_not_null(object)が失敗すると以下の2行を含んだバックトレースが得られます:

  • cut_assert_not_null(object)

  • create_my_object_helper("my-name")ではなくcreate_my_object("my-name")

もし、cut_trace_with_info_expression()ではなくcut_trace()を使った場合はcreate_my_object_helper("my-name")になります。もし、create_my_object_helper("my-name")が得られたら以下のように混乱してしまうかもしれません。「create_my_object_helper("my-name")はどこからきたんだ?test_my_object_name()はcreate_my_object("my-name")は使っているけど、create_my_object_helper("my-name")は使っていないぞ。」

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static MyObject *object;

static void
create_my_object_helper(const char *name)
{
    object = my_object_new(name);
    cut_assert_not_null(object);
}

#define create_my_object(...)                        \
    cut_trace_with_info_expression(                  \
        create_my_object_helper(__VA_ARGS__),        \
        create_my_object(__VA_ARGS__))

void
test_my_object_name(void)
{
    create_my_object("my-name");
    cut_assert_equal_string("my-name",
                            my_object_get_name(object));
}

expression :

呼び出されたことを記録される式。

info_expression :

呼び出されたと記録される式。

1.0.5から