🦀

100日後にRustをちょっと知ってる人になる: [Day 54]単体テスト

2022/10/23に公開約1,600字

Day 54 のテーマ

今までいろいろなサンプルを作って動かしてみたりしてきました。ただ、その動作確認は実際に動かしてみたり、動作を目で確認してみたりというものでした。通常、コードを書いて動作確認をする場合はテストコードを書いて単体テストなどを行ったりしますよね。Rust も単体テストを実行する仕組みがああります。

今日はすこしその単体テストの仕方を見てみたいと思います。

テストの書き方

テストの書き方はとてもシンプルです。
関数の fn キーワードの前に #[test] を付けるだけです。

テスト対象の関数:

fn print_message(msg: String) -> String {
    println!("{}", msg);
    msg
}

テスト関数:

#[test]
fn test_message() {
    assert_eq!("Hello", print_message("Hello".to_string()));
}

テストの実行

cargo test コマンドでテストを実行します。

cargo test
   Compiling day_54_unit-test v0.1.0
    Finished test [unoptimized + debuginfo] target(s) in 0.43s
     Running unittests src/main.rs

running 1 test
test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

特に問題が発生せず正常終了する場合は、上記のように test ... ok と表示されます。
テストが失敗する場合は、以下のように表示されます。

running 1 test
test test_message ... FAILED

failures:

---- test_message stdout ----
Hello
thread 'test_message' panicked at 'assertion failed: `(left == right)`
  left: `"Hello!"`,
 right: `"Hello"`', src/main.rs:12:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    test_message

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

どこで失敗したか、なぜ失敗したかを表示してくれます。

また、特定のテストコードだけを実施したい場合は、テスト関数名を指定して実行できます。

cargo test test_message

Day 54 のまとめ

単体テストの書き方を見てみました。
特に特別な作法もいらず、#[test] を関数につけるだけで実施できることが分かりました。

しかし、テストコードを通常のアプリケーションコードと同じモジュールに含めると可読性が悪くなるのでモジュールは分離したほうが良さそうです。テストコードの体系化を少し考えてみたいと思いました。

GitHubで編集を提案

Discussion

ログインするとコメントできます