$ cargo test
Compiling adder v0.1.0 (file:///projects/adder)
Finished test [unoptimized + debuginfo] target(s) in 0.57s
Running target/debug/deps/adder-92948b65e88960b4
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
テストのお約束
Runningの後にテストの結果が表示される
テストがパスしたらok,失敗するとFAILED
test result:の行では,テストの結果が要約される
passed及びfailedはテストがパス/失敗した数
ignoredは無視したために実行されなかったテスト(後述)
measuredはベンチマークテスト向け(nightlyのみ)
filtered outはフィルタされたテストの数(後述)
$ cargo test
(省略)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
pubfngreeting(name: &str) -> String { String::from("Hello!") }
#[cfg(test)]mod tests {
use super::*;
#[test]fngreeting_contains_name() {
let result = greeting("Carol");
assert!(
result.contains("Carol"),
"Greeting did not contain name, value was `{}`", result
);
}
}
カスタムの失敗メッセージを確認する
$ cargo test
(省略)
running 1 test
test tests::greeting_contains_name ... FAILED
failures:
---- tests::greeting_contains_name stdout ----
thread 'main' panicked at 'Greeting did not contain name, value was `Hello!`',
src/lib.rs:12:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
failures:
tests::greeting_contains_name
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--lib'
11.2. テストの実行のされ方を制御する
cargo testはコードをテストモードでコンパイルし,全てのテストを並行に実行する
テスト実行中に生成された出力はキャプチャされ,表示されるのを防ぐ
本節ではテストの実行のされ方について述べる
キーワード:--test-threads,--nocapture,ignore属性
テストを逐次に実行する
cargo testは複数のテストを並列に実行する
共通の資源を利用する機能をテストする場合,注意が必要
テストを逐次に実行したい場合は--test-threadsを使用する
$ cargo test -- --test-threads=1
関数の出力を表示する
テスト実行時は標準出力に出力されたものを全てキャプチャされる
テストに失敗した場合にのみキャプチャされた内容が出力される
成功した場合も標準出力の内容を確認したい場合は--nocaptureを使用する
$ cargo test -- --nocapture
単独のテストを実行する
名前を指定することで,特定のテストを実行できる
one_hundredを実行したい場合はcargo test one_hundredを実行
$ cargo test one_hundred
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running target/debug/deps/adder-06a75b4a1f2515e9
running 1 test
test tests::one_hundred ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out
複数のテストを実行する
テスト名の一部を指定することで,その名前を含む関数を実行できる
$ cargo test add
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running target/debug/deps/adder-06a75b4a1f2515e9
running 2 tests
test tests::add_two_and_two ... ok
test tests::add_three_and_two ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out
テストを無視する
テストしたくない関数がある場合,ignore属性で除外できる
#[test]#[ignore]fnexpensive_test() {
// code that takes an hour to run
}
$ cargo test
(省略)
running 2 tests
test expensive_test ... ignored
test it_works ... ok
test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out
無視したテストだけ実行する
ignore属性を指定したテストのみ実行することも可能
$ cargo test -- --ignored
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running target/debug/deps/adder-ce99bcc2479f4607
running 1 test
test expensive_test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out
$ cargo test --test integration_test
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running target/debug/integration_test-952a27e0126bb565
running 1 test
test it_adds_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
結合テスト内のサブモジュール
結合テスト用のサブモジュールは,さらに1つ深い階層に置くことで利用できる
// tests/common/mod.rspubfnsetup() {
// setup code specific to your library's tests would go here
}
// tests/integration_test.rsexterncrate adder;
mod common;
#[test]fnit_adds_two() {
common::setup();
assert_eq!(4, adder::add_two(2));
}