Assertion (アサーション)

  • テストとは違いますが・・・

Assert とは?

  • ある式・値が想定したものになっているかを確認する関数。
  • 引数が true の時何もせず、false の時異常を出してプログラムを終了させる。
  • 一般的にはある変数が期待した値になっているかを判定する式を引数として食わせる。
  • デバッグビルド時には動作し、リリースビルド時には実行されない。(確認作業も含めて)
int i = 0;
Debug.Assert(0 <= i);
// OK

i = -1;
Debug.Assert(0 <= i);
// Error !!

C での Assert

#include <assert.h>

void assert(
    expression
);
  • NDEBUG マクロが定義されていない時は処理されて、定義されているときには処理されない。
  • expression0 [偽] の場合、どこで問題があったのかを表示して、プログラムを停止させる。
  • プログラムを殺すという機能から、組み込み環境でも提供されているかは環境によると思います。

C# での Assert

namespace System.Diagnostics {
    public static class Debug {

        [ConditionalAttribute("DEBUG")]
        public static void Assert(
            bool condition
        );
    }
}
  • Debug ビルドの時は処理されて、それ以外では処理されない。
  • 引数 conditiontrue の時何もせず、 false の時異常を出す。
    • Windows アプリケーションの場合は、メッセージボックスが出て 中止, 再試行, 無視 を選べる。

例外との違い

  • 例外は、その後処理することを前提としているが、Assert はプログラムの終了を前提としている。
  • なので、その状況が想定の範囲内の異常値の場合は例外、設計上ありえない場合は Assert を使用する。
    • 外部からの入力値の異常を示すときは ArgumentException を利用する。
    • 内部の設計上、『そこにその値が入っている時点でバグ』といった場合には Debug.Assert を利用する。
  • Assert は問題があった時点でプログラムが終了するので、『待っていたらそのうちおかしな値になる』場合には不向き(この場合はログを取った方がいい)