https://doc.rust-jp.rs/book-ja/ch11-00-testing.html ## テストの記述法 ```console cargo new --lib test-sandbox ``` test[[アトリビュート]]で注釈された関数がテスト関数。 ```rust #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } } ``` [[assert_eqマクロ]]マクロは、[[ベクター]]を値で判定してくれてそう。 ```rust #[test] fn it_works2() { let a1 = vec![1, 2]; let a2 = vec![1, 2]; assert_eq!(a1, a2); } ``` - [[assert_eqマクロ]]と[[assert_neマクロ]] - [[assert_eqマクロ]] - 2つの値が等しいことを確認 - 内部的には `==` 演算子を利用している - [[assert_neマクロ]] - 2つの値が等しくないことを確認 - 内部的には `!=` 演算子を利用している - `left`と`right`のどちらが期待値かは決まっていない (個人的には左派) - [[PartialEqトレイト]]と[[Debugトレイト]]の実装が必須 - 比較して、条件を満たしていなければ出力しなければいけないから - [[Rustのテストでpanicが起こるかを確認]] - [[RustのテストでQuestion mark operatorを使う]] ## テストの実行のされ方を制御する - デフォルトの挙動 - すべてのテストを並行に処理 - `cargo test -- --test-thread=1` で直列 - 出力はキャプチャ (表示されない) - コマンドラインオプションの違い - `cargo test`にかかるもの - `cargo test ここに指定` - テストバイナリにかかるもの - `cargo test -- ここに指定` - [[📝Rustのテストでprintlnなどが標準出力に表示されない]] - [[Rustのテストで特定の名称を含むテスト関数やモジュール内のテストだけを実行]] - [[Rustの特定テストを無視]] - [[cargo testでignoreのテストを実行]] ## テストの体系化 - `#[cfg(test)]`は`cargo test`のときだけ対象[[モジュール (Rust)|モジュール]]を[[コンパイル]]するような定義 - [[cfgアトリビュート]] - 結合テストは`tests`ディレクトリ - 配下に`tests/integration_test.rs`のような名前 `tests/integration_test.rs` ```rust use test_sample; #[test] fn it_pass() { assert_eq!(10, test_sample::prints_and_returns_10(4)) } ``` > [!hint] > 日本語版では`use`ではなく`extern`を使ったコードが記載されているが、英語版では`use`のためドキュメントまたはエディションが古いと思われる。 > [!question] > `use test_sample`は省略しても動いた。必須ではない...? - [[Rustで特定ファイルの結合テストだけを実行]] - [[Rustの結合テスト関数で利用するテスト対象外の関数を定義]] - [[Rustのバイナリクレートには結合テストを書けない]]