12 — テストを書く
前: モジュールとパッケージ
English version: 12_tests.vibe.md
テストは、普通のソースファイルに書く test "name" { ... } ブロックです。
入れるフレームワークも、import するものもありません。
fn double(n: Int) -> Int {
n * 2
}
test "double works" {
assert_eq(double(21), 42)
assert(double(0) == 0)
}
慣習として _test.vibe で終わるファイルに置きます。そうするとビルドが
配布パッケージから除外できます。
vibe test demo_test.vibe # 1ファイル
vibe test a_test.vibe b_test.vibe # 複数
vibe test tests/ # 配下のすべての *_test.vibe
通ったファイルは、ファイルごとの報告と 1 行のサマリで報告されます:
$ vibe test demo_test.vibe
ok demo_test.vibe
[vibe-test] 1 passed, 0 failed (1 files, 1 tests)
失敗したとき
期待値を 43 に変えると、レポートはテスト名を挙げ、両側を見せて止まります:
$ vibe test demo_test.vibe
FAIL demo_test.vibe
failing test: double works
assert_eq failed
expected: 43
actual: 42
[vibe-test] 0 passed, 1 failed (1 files, 1 tests)
レポートにはまだ行番号が付かないので、同じ期待値の assert が1つの テストに2つあると区別できません (#2202)。
assert_eq(actual, expected) は比較可能な任意の型で使え、文字列は内容で
比較します — なので連結の結果や関数の戻り値に対して、何も変換せずそのまま
表明できます。素の Bool には assert(cond) を使います。
inspect — 期待値をツールに書かせる
値がどう見えるべきかは分かっているが打ち込みたくない、まして書式が
正当に変わるたびに打ち直したくない、ということはよくあります。inspect は
期待される描画結果をソース中に置き、その保守をツールがやります:
fn double(n: Int) -> Int {
n * 2
}
test "inspect records the value" {
inspect(double(3), "6")
}
--update を付けて実行すると、古くなった期待値がコードの実際の出力に
書き換えられます:
vibe test --update demo_test.vibe
そして差分を読みます。それがワークフローです — ツールが提案し、人が
レビューする。文字列を手で保守するよりずっと良く、差分を読まなかった場合は
assert_eq よりずっと悪い。見ずに受け入れたスナップショットは、何も表明して
いないテストです。
答えが分かっていて、それが重要なら assert_eq を。手で書き出すことだけが
テストを書かない理由になっているような、大きめの構造の形には inspect を
使ってください。
直接呼べないものをテストする
テストはパッケージの内側にあるので、その内部に手が届きます — テストファイルは 利用者には使えないモジュールを使えます。テストのためだけに export しなくても ヘルパーをテストできるのはこのためです。テストをコードの隣に置く理由が これです。
次: コレクション。