Rustのtest
/mrsekut-book-4297105594/437 (10-3 テストの追加)
GPT-4.icon
1. #[test]アトリビュートを使う
テスト関数を識別するために使用します
このアトリビュートが付いている関数は、λ cargo testコマンドで実行されます。
2. アサーションを使う
テストでは、期待される結果を確認するためにアサーション(assert!やassert_eq!など)を使います。
#[cfg(test)]
テストを書く場所
/mrsekut-book-4297105594/444
プログラム中
#[test]とか使うやつ
プログラム中のテスト用のモジュール内
#[cfg(test)]とか使うやつ
/mrsekut-book-4297105594/444
tests/内
/mrsekut-book-4297105594/445
docsコメント内
/mrsekut-book-4297105594/449
例
code:rust
#cfg(test) // テスト用モジュールを区切る
mod tests {
use super::*; // テストでモジュールの関数や構造体を使うためにインポート
#test
fn it_works() {
assert!(1 + 1 == 2); // 条件がtrueであることを確認
}
#test
fn test_addition() {
let result = 2 + 2;
assert_eq!(result, 4); // 左右が等しいことを確認
}
#test
fn test_subtraction() {
let result = 5 - 3;
assert_ne!(result, 1); // 左右が等しくないことを確認
}
}
---
主なアサーションマクロ
assert!
条件がtrueであることを確認します。
条件がfalseの場合、テストは失敗します。
メッセージをカスタマイズ可能。
code:rust
assert!(value > 0, "Value must be positive, but got {}", value);
assert_eq!
左右の値が等しいことを確認します。
Debugトレイトが実装されている値を比較します。
code:rust
assert_eq!(result, expected, "Result does not match expected value");
assert_ne!
左右の値が等しくないことを確認します。
code:rust
assert_ne!(result, not_expected);
panic!
条件を満たさない場合に手動でパニックを発生させることができます(通常はカスタムのエラーチェック用)。
code:rust
if value > 100 {
panic!("Value is too large: {}", value);
}
---
Resultを返すテスト
テスト関数はResult型を返すこともできます。この場合、Ok(())が返されれば成功と見なされます。
code:rust
#test
fn test_with_result() -> Result<(), String> {
if 2 + 2 == 4 {
Ok(())
} else {
Err(String::from("Math is broken"))
}
}
/mrsekut-book-4297105594/441
---
非同期のテスト
非同期コードをテストするには、tokioやasync-stdのような非同期ランタイムを使用します。
code:rust
#tokio::test
async fn test_async_function() {
let result = async_function().await;
assert_eq!(result, expected_value);
}
---
特殊なテスト
1. パニックを確認するテスト
特定のコードがパニックを引き起こすことを確認します。
code:rust
#test
#should_panic
fn test_should_panic() {
panic!("This test should panic!");
}
#test
#should_panic(expected = "Specific panic message")
fn test_should_panic_with_message() {
panic!("Specific panic message");
}
/mrsekut-book-4297105594/442
2. スキップ可能なテスト
特定の条件でテストをスキップしたい場合に使います。
/mrsekut-book-4297105594/443
code:rust
#test
#ignore
fn test_to_skip() {
// このテストはデフォルトでは実行されない
}
---
テストの実行
基本の実行:
テストを実行するには、cargo testコマンドを使います。
詳細な出力:
標準出力や詳細なエラー情報を表示するには-- --nocaptureを付けます。
code:bash
cargo test -- --nocapture
特定のテストを実行:
特定のテストだけを実行したい場合は、名前を指定します。
code:bash
cargo test test_name