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のバイナリクレートには結合テストを書けない]]