テストとなるコードには#[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/以下に置くのが推奨のようです。テストの書き方はユニットテストと同じです。