#TheBook
https://doc.rust-lang.org/book/ch11-01-writing-tests.html
## メモ
### ポイント
- testsモジュールに `use super::*;` を記入
- テスト対象の関数を利用するため
- 通常は`tests`モジュールが定義されたファイルがテスト対象だから
- `#[test]` annotationがついている関数がテスト
- panicが期待値なら`#[should_panic]`をつける
- `expected`引数を指定するとエラーメッセージの部分一致判定
- テスト関数で[[std.result.Result|Result]]を返す方法もある
- [[std.result.Result.Ok|Ok]]がsuccess、[[std.result.Result.Err|Err]]がfail
- [[Question mark operator]]を使う場合に便利
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
// DO...
}
#[test]
#[should_panic(expected = "oh")]
// panicのメッセージにohが含まれていればOK
fn it_panics() {
panic!("ohhhhhhhhhhhhhhhhhhh");
}
#[test]
fn it_fails() -> Result<(), String> {
// Ok(())
Err("faillllllllllllllure!!".into())
}
}
```
### マクロ
| マクロ | 説明 | 使用例 |
| -------------- | --------------- | ------------------------ |
| [[assert!]] | trueかどうか | `assert!(boolean_var)` |
| [[assert_eqマクロ]] | 2値の一致判定 | `asser_eq!(left, right)` |
| [[assert_neマクロ]] | 2値の不一致判定 | `asser_ne!(left, right)` |
大抵の言語は`(expected, actual)`と呼ぶが、[[Rust]]では`(left, right)`。
### 実装が必要なトレイト
- 失敗時の詳細表示に[[Debugトレイト]]
- 比較のために[[PartialEqトレイト]]