## Cutter Cutter — C言語用単体テストフレームワーク |

## 概要

    void                setup                               (void);
    void                teardown                            (void);
    void                startup                             (void);
    void                shutdown                            (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は簡単にテストを書くことを支援するだけではなく、簡単にデバッグをできることも支援します。

## 詳細

### setup ()

    void                setup                               (void);

テストプログラム中で`setup()`を定義していたら、cutterは各テストが実行される前に定義された`setup()`を呼びだします。

### teardown ()

    void                teardown                            (void);

テストプログラム中で`teardown()`を定義していたら、cutterは各テストの後に、たとえテストが失敗していた時でも、`teardown()`を呼びだします。

### startup ()

    void                startup                             (void);

テストプログラム中で`startup()`を定義していたら、cutterは各テストケースが実行される前に定義された`startup()`を呼びだします。

0.8から

### shutdown ()

    void                shutdown                            (void);

テストプログラム中で`shutdown()`を定義していたら、cutterは各テストケースが実行された後に定義された`shutdown()`を呼びだします。

0.8から

## 参考

検証