株式会社クリアコード > フリーソフトウェア開発 > Cutter

Cutter C言語・C++言語用テスティングフレームワーク

開発サイクルを加速するテスティングフレームワーク Cutterは書きやすさ・デバッグのしやすさを重視したC言語・C++言語用のテスティングフレームワークです。メンテナンスしやすく、利用効果の高いユニットテスト(単体テスト)の開発を支援します。

Cutterが重視しているのは「書きやすさ」と「デバッグのしやすさ」です。Cutterがこの2点を重視しているのは、テストを開発し続けるため・テストの価値を高いものに維持しつづけるためです。

Cutterが重視している書きやすさとデバッグのしやすさ

書きやすさ

テストの書きやすさ テストは一度書いてそれで終わりではありません。機能が変更されたらテストも変更しなければいけませんし、機能が追加されたらテストも追加しなければいけません。そのようにテストをメンテナンスしながら開発を進めることでテストの価値を高いものに維持しつづけることができます。Cutterはテストを書きやすくすることで、このような優れた開発習慣を維持しつづけることを支援します。

テスト定義は通常の関数定義

Cutterはテストを定義するために特別なマクロを使いません。通常通り関数を定義するだけです。また、面倒なテストを登録する処理を記述する必要もありません。定義されたテストは自動で検出されます。

void
test_sum (void)
{
   ...
}

C++言語の場合も同様に特別なマクロを使いません。C言語のときと同様、通常通り関数を定義するだけです。ただし、テストはnamespace内に定義します。

namespace calc
{
    void
    test_sum (void)
    {
       ...
    }
}

Cutterではnamespaceでテストをグループ化します。通常のC++言語を用いたソフトウェアもnamespaceを用いてモジュールやパッケージをグループ化します。つまり、通常の開発と同じようにテストを書けるということです。

CutterではC言語の場合でもC++言語の場合でも、通常のソフトウェア開発と同じようにテストが書けることを重視しています。これによりテストを書くための敷居が下がり、継続してテストを書くことができます。これが開発を継続するために重要なこと、つまり、きれいなコードを維持することにつながるのです。

メモリ管理機能

C言語・C++言語でのメモリ管理は面倒なものです。

Cutterのメモリ管理機能を使用すれば、テスト中で使用するメモリ管理をCutterに任せることができます。これにより、メモリ解放のタイミングに気をつかう必要がなくなり、テストの重要な部分に専念することができます。

データ駆動テスト

パラメータを変更して様々なパターンをテストしたいことが多くあります。Cutterはデータ駆動テストをサポートしているのでそのようなテストもすっきりと書くことができます。

多くの標準アサーション

適切なアサーションを使用することにより、アサーションが失敗したときにより多くの有用な情報を提供することができます。Cutterは標準で50以上のアサーションを提供しているため、新規にアサーションを定義しなくとも適切なアサーションを使用することができます。

C++言語にはポリモーフィズムなどオブジェクト指向プログラミングのための機能が含まれています。ポリモーフィズムは同じ名前の操作をオブジェクトに応じて切り替える機能です。C言語の場合は型に応じてアサーションを変える必要がありますが、C++言語を用いている場合は同じアサーション名を用いることができます。

C言語:

void
test_add (void)
{
    /* int用アサーション */
    cut_assert_equal_int(3, 1 + 2);
    /* 文字列用アサーション */
    cut_assert_equal_string("abcdef", strcat("abc", "def"));
}

C++言語:

namespace adder
{
    void
    test_add (void)
    {
        /* intも文字列も同じアサーション名 */
        cppcut_assert_equal(3, 1 + 2);
        cppcut_assert_equal("abcdef", strcat("abc", "def"));
    }
}

Cutterは言語に応じてより自然な方法で多くのアサーションを提供します。C言語用にはよく使われる型やオブジェクト専用のアサーションを組み込みで提供します。C++言語用にはポリモーフィズム・テンプレートを用いて多くのオブジェクトに対応したアサーションを提供します。

外部プロセス

Cutterは外部プロセスを簡単に管理することができます。コマンドのテストや複数プロセスを用いたテストも、外部プロセスの死活管理などに悩まされることなく、簡単に書くことができます。

マルチスレッド

Cutterはマルチスレッドでのテスト実行をサポートしています。マルチスレッド対応プログラムのテストも簡単に書くことができます。

マルチプロセス

Cutterはサブプロセスを生成し、複数のプロセスで同時にテストを実行することができます。マルチプロセス対応プログラムのテストも簡単に書くことができます。

デバッグ支援

デバッグのしやすさ テストは常にパスし続けるわけではありません。機能が変更されたらテストは失敗するでしょうし、変更が意図しない箇所に影響を与えてしまった場合も失敗するでしょう。ユニットテストはそのような変化を教えてくれます。

しかし、開発者の作業は変化に気づいて終わりではありません。その変化が望まれた変化かどうかを判断し、それに応じた対応をしなければいけません。これは「デバッグ」と呼ばれる作業です。デバッグ作業は、問題の把握、原因の解明、問題の解決、の3ステップです。Cutterは「問題の把握」を強力に支援することにより、デバッグ作業を効率的なものにします。

少ない出力

問題を把握しやすくするためには不要な情報を提供しないことです。単純に情報を多く提供すると大事な情報が埋もれてしまって逆効果です。

Cutterは問題がないときはできるだけ情報を提供せず、大事な情報が埋もれてしまうことを防ぎます。

詳細な出力

問題があった場合は、問題発生時の状況がわかるための情報をできるだけ多く提供します。これにより、素早く問題を把握することを支援します。

詳細な出力 - バックトレース

問題が発生した箇所(ファイル名、行番号)を提供することはもちろんですが、必要であればバックトレース(どのような経路でその処理に到達したかの情報)も表示し、どうして問題が発生したかを把握しやすくします。

詳細な出力 - 差分表示

日本語対応の色付きの差分表示機能 問題発生箇所と同じように期待値と実際の値がどのように違ったかの情報も非常に有用です。必要であればそれらの値を見やすい形式で表示します。テキストの差分表示はもちろん、画像の差分表示にも対応しているため、スクリーンショット画像の違いもわかりやすく表示することができます。

詳細な出力 - オブジェクト表示

C言語でも多くのプログラムがオブジェクトを利用しています。問題発生時にオブジェクトの状態を表示することにより、問題の把握を支援することができます。C言語ではオブジェクトを構造体のポインタとして扱いますが、Cutterは単にポインタのアドレスを表示するのではなく、持っているデータなどオブジェクトの中身を表示することができます。

ライセンス

Cutterはフリーソフトウェアです。あなたは、 Free Software Foundationが公表したGNU Lesser General Public License 3またはそれ以降のバージョンが定める条項に従って本プログラムを再頒布または変更することができます。

Cutterは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細については GNU Lesser General Public License 3をお読みください。

有償サポート・技術支援

クリアコードではCutterの有償サポート・テスト開発・導入支援・教育を行っています。詳細についてはinfo@clear-code.comまでお問い合わせください。

プロジェクトサイト

CutterはSourceForge上で開発が行われています。インストール方法・リファレンスマニュアル・ダウンロードなどの情報はSourceForge上のCutterプロジェクトサイトを参照してください。