テストとなるコードには#[test]
属性を付けます。テスト関数の中ではassert!
やassert_eq!
マクロを使って期待する値が得られたかどうかを確認します。
assert!
は結果にtrue
を、assert_eq!
は与えた2つの値が同じ値であることを期待します。
#[test]
fn foo() {
assert!(true);
// 値が違うので、このテストは失敗する
assert_eq!(2, 1);
}
もし、失敗することが正なのであれば一緒に#[should_panic(expected = 'panic message')]
属性を付けます。expected
に指定する値は Panic 時のメッセージを渡しいます。assert_eq!
の Panic はassertion failed
と言うメッセージ含んでいる為以下のテストは成功します。
#[test]
#[should_panic(expected = 'assertion failed')
fn foo() {
assert!(true);
assert_eq!(2, 1);
}
テストはcargo test
またはcargo test foo::foo
で走らせられます。違いは後者はそれだけを走らせられます。
またいつもは実装したくないようなテストの為に#[ignore]
という属性も用意されてます。このテストはcargo test -- --ignored
とした時のみ走るので CI などではこのように実行させるといいと思います。
上記のテストの書き方はコンパイルに含まれてしまうので、#[cfg(test)]
属性を付けたモジュールに閉じ込めると、テストの時だけコンパイルされるようになります。モジュール名はtests
が良く使われますが何でも大丈夫です。
#[cfg(test)]
mod tests {
#[test]
fn do() { ... }
}
このような形でcargo test
すると、
running 1 test
test tests::do ... ok
のような形で表示されます。
結合テスト
結合テストはtests/
以下に置くのが推奨のようです。テストの書き方はユニットテストと同じです。