オフィスアワーがそろそろ始まるよ!()

アサーション

プログラムが正しく動作していることをテストするための機能です。次に学ぶユニットテストとの違いは、ユニットテストがテストブロック内で使用されるのに対して、アサーションはテストブロック以外、つまりプロダクトコード内で使用されることです。

std.debug.assert

アサーションで利用する関数は、標準ライブラリの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);
          ^
...

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
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.