プログラムが正しく動作していることをテストするための機能です。次に学ぶユニットテストとの違いは、ユニットテストがテストブロック内で使用されるのに対して、アサーションはテストブロック以外、つまりプロダクトコード内で使用されることです。
アサーションで利用する関数は、標準ライブラリのstd.debug.assert
関数です。assert
関数はブール型の引数を1つ受け取ります。この引数がfalse
の場合、アサーションが失敗し、安全性保護付き未定義動作が発生します。
次のコードのように、assert
関数の引数がtrue
であればアサーションがOK
であることを意味します。
fn assertOk() void {
assert(true);
}
逆に、assert
関数の引数がfalse
であればアサーションがNG
となります。
fn assertNg() void {
assert(false);
}
もう少し意味のある例を見てみます。整数同士の除算の除数が0
の場合、ゼロ除算例外が発生し、正しい除算の結果が得られません。そこで、除数が0
でないことをassert
で保証するコード例を示します。
ノート: Zenの除算 (
/
) オペレータはデフォルトで除数が0
かどうかをチェックするので、実際には次のようなコードを書く必要はありません。
fn div(dividend: u32, divisor: u32) u32 {
assert(divisor != 0);
return dividend / divisor;
}
この関数の除数 (divisor
) に対して、0
を与えて呼び出してみます。
const ok = std.testing.ok;
fn div(dividend: u32, divisor: u32) u32 {
assert(divisor != 0);
return dividend / divisor;
}
test "div" {
ok(div(2, 0) == 0);
}
結果は次のようにassert
が失敗したことで、unreachable
に到達した、という実行時エラーになります。
1/1 test "div"...reached unreachable code
/lib/zen/std/debug.zen:219:14: 0x207c5b in std.debug.assert (test)
if (!ok) unreachable; // assertion failure
^
assert/src/assert.zen:5:11: 0x2080ac in div (test)
assert(divisor != 0);
^
...
☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.