Rustでユニットテストを書く方法を調べた
作成: 2020-11-23
更新: 2020-11-23
Rustのテストコード
Rustのユニットテストの書き方を調べたので少しだけですがメモを残します。
RustのビルドツールCargoには、標準でユニットテストを実行する方法が用意されています。
決められた記述でユニットテストコードを簡単に追加できます。
この記事で使っているRustのバージョンは、1.47.0
です。
nnnamani/rust_unittest_sampleにサンプルコードを書いてみました。
テストコードの書き方
以下の条件を満たすことで、ユニットテストコードを実行できます。
#[cfg(test)]
属性をつけたtests
モジュールを定義し、その中にテスト関数を書く- テスト関数には、
#[test]
属性をつける
テストコードは、実装のコードと同じファイル内に書くことができます。
テスト関数内でpanic
が発生するとテストがFAILED
になります。
テストのために、以下のヘルパーマクロが用意されています。
- assert!(expression)
expression
の評価結果がfalseの場合、panicを発生させ、テストをFAILEDにします。
- assert_eq!(left, right)
left
とright
が一致しない場合は、panicを発生させ、テストをFAILEDにします。
- assert_ne!(left, right)
left
とright
が一致する場合は、panicを発生させ、テストをFAILEDにします。
以下は、サンプルコードのsrc/lib.rsに書いたテストコードです。
pub fn greet_message() -> String {
String::from("Hello, Rust!")
}
pub fn add(left: u32, right: u32) -> u32 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_greet_message_is_hello_rust() {
assert_eq!("Hello, Rust!", greet_message());
}
#[test]
fn test_add_should_add_left_and_right() {
let left = 1;
let right = 2;
assert_eq!(left + right, add(left, right));
}
#[test]
fn test_add_should_not_muoltiply_left_and_right() {
let left = 1;
let right = 2;
assert_ne!(left * right, add(left, right));
}
}
テストの実行方法
cargo test
コマンドを使ってユニットテストを実行できます。
$ cd rust_unittest_sample
$ cargo test
Compiling rust_unittest_sample v0.1.0 (/home/mani/rust_unittest_sample)
Finished test [unoptimized + debuginfo] target(s) in 0.20s
Running target/debug/deps/rust_unittest_sample-0629c8e736655abc
running 3 tests
test tests::test_add_should_add_left_and_right ... ok
test tests::test_add_should_not_muoltiply_left_and_right ... ok
test tests::test_greet_message_is_hello_rust ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/rust_unittest_sample-51cd30d7bc733ca9
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests rust_unittest_sample
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
まとめ
Rustでのユニットテストの書き方を調べてみました。
Cargoを使ってできるテストには、他に統合テストもあったり、また、ドキュメント内にテストコードを書くことができる機能もあるようなので、今度調べてみたいと思います。