NnmnLog

Rustでユニットテストを書く方法を調べた

作成: 2020-11-23
更新: 2020-11-23
タグ: Rust Programming

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)
    • leftrightが一致しない場合は、panicを発生させ、テストをFAILEDにします。
  • assert_ne!(left, right)
    • leftrightが一致する場合は、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を使ってできるテストには、他に統合テストもあったり、また、ドキュメント内にテストコードを書くことができる機能もあるようなので、今度調べてみたいと思います。