やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのcargoでライブラリ&テスト(単体、結合)

 サクッとできてしまう。

成果物

プロジェクト作成からテスト実行まで

1. プロジェクト作成

$ cargo new my_project --lib

2. ビルド

$ cargo build

 じつはこの肯定は不要。次のcargo testをやれば自動的に実行されるから。

3. 単体テスト

$ cargo test

 以下のような出力を得られる。

   Compiling communicator v0.1.0 (/tmp/work/communicator)
    Finished dev [unoptimized + debuginfo] target(s) in 3.05s
     Running target/debug/deps/communicator-9820f266b5f5cd1b

running 3 tests
test adder::tests::test_add_two ... ok
test tests::it_works ... ok
test tests::test_get_message ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/integration_test-1d08c00d9b209e5e

running 1 test
test it_adds_two ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests communicator

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

単体テストコード

  • プロジェクト/
    • src/
      • lib.rs

lib.rs

// 実装
fn get_message() -> String { String::from("Hello world !!") }

// 単体テスト
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_get_message() {
        assert_eq!(get_message(), String::from("Hello world !!"));
    }
}

 Rustで単体テストするときは上記コードのように、同一ファイル内にmod tests {}モジュールを作って書くのが慣習らしい。

 上記コードの場合、pubで公開されていない関数がテストコードで参照できている。C#など他言語ではpublicメソッドしかテストできなかったのに。書き方によってはprivateは参照できなくなる。詳細は別途pubの項でやるためここでは省略。

  • use super::*;
    • testsモジュール内にて、同モジュールの直上親モジュールに定義された要素すべてを展開する(接頭辞モジュール名::なしで参照)
  • 注釈(アノテーション
    • #[test]
      • テストコードであることを示す
    • #[cfg(test)]
      • cargo testコマンドを実行したときだけビルドされるようになる

結合テストコード

  • プロジェクト/
    • src/
      • lib.rs
    • tests/
      • integration_test.rs

integration_test.rs

extern crate クレート名;

// 結合テスト
#[test]
fn test_get_message() {
        assert_eq!(クレート名::get_message(), String::from("Hello world !!"));
}

 クレート名cargo newしたときの名前を使う。

 注意すべきはpubで公開された関数しか参照できないこと。lib.rsにあるfn test_get_message()を公開すべくpub fn test_get_message()として定義すべき。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで