単体テストの拡張
D言語組み込みの単体テストサポートは、テストコードと実装コードをすぐ近くに 配置するために非常に便利です。これによって、 単体テストが実装コードと常に平行して更新され、 実行されるという効率的な管理が実現されます。Dでのもっとも直接的な単体テストの使い方としては、 契約の確認のための assert() が使用されます:
unittest { assert(x == 5); }そしてもし assert が失敗したら、AssertError 例外が送出され、 ランタイムライブラリがそれをcatchし、メッセージを表示して、 アプリケーションを終了します。
これが本質的な作業なのですが、より柔軟な処理を行いたいプログラマも いらっしゃるでしょう。例えば、 最初のエラーで停止するのではなく、 一回の実行で発生したすべてのエラーのログを取りたいかもしれません。
以下に、それを実現するアプローチをいくつか紹介します:
- 単体テストの中で:
assert(e);
の代わりに、myassert(e, "message");
と書いて、myassert() を全てのエラーを適切なログファイルへ出力するよう実装します。 - 以下の関数を独自に実装し、中でログ取りを行います:
extern (C) void _d_assert(char[] filename, uint line);
_d_assert は、assert が引っかかったときに呼び出される関数です。独自の実装が提供されていると、 Phobosライブラリのものはリンクされなくなります。 - AssertError 例外を全てcatchし、ログを記録して、
単体テストを続行します:
import std.asserterror; unittest { try { assert(...); ... } catch (std.asserterror.AssertError ae) { ae.print(); } }
この方法では、assertをグループ化して、 どの範囲をスキップするかなどをコントロールすることができます。