テスト

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