#Rust #TheBook
https://doc.rust-lang.org/book/ch11-03-test-organization.html
## メモ
### ポイント
- テストは[[ユニットテスト]]と[[インテグレーションテスト]]の2種類がある
- [[ユニットテスト]]は`src`ディレクトリ配下でプロダクトコードと同じ場所の`tests`モジュールに書く
- `#[cfg(test)]` アノテーションによって`cargo test`以外のコマンド実行時にテストコードを完全に無視できる
- private functionをテストするかは開発者の自由
- [[インテグレーションテスト]]は`tests`ディレクトリ配下に書く
- [[Cargo]]は`tests`ディレクトリの役割を知っているので`#[cfg(test)]`は不要
### [[インテグレーションテスト]]
#### テストの実行
`tests`ディレクトリ配下にテストファイルを作る。
`📝tests/sample_test.rs`
```rust
#[test]
fn one_plus_one() {
assert_eq!(2, 1 + 1);
}
```
`📝tests/sample_test2.rs`
```rust
#[test]
fn one_plus_one() {
assert_eq!(2, 1 + 1);
}
```
`cargo test`ですべてのテストが実行される。
#### 任意のテストを実行
任意のテストを実行したい場合は`cargo test --test <ファイル名(拡張子なし)>`とする。
```shell
# sample_test2.rsのテストは実行されない
cargo test --test sample_test
```
#### テストヘルパー
テスト用ヘルパーモジュールを定義する場合、`libs.rs`などを作成すると、そのファイルがテスト対象と見なされてしまう。その場合はファイル名を`mod.rs`とし、`tests/libs`のようなディレクトリ配下に作成すればよい。
```ls
./tests
├── libs
│ └── mod.rs
└── sample_test.rs
```
```rust:mod.rs
pub fn add(x: i32, y: i32) -> i32 {
x + y
}
```
```rust:sample_test.rs
mod libs;
#[test]
fn one_plus_one() {
assert_eq!(2, libs::add(1, 1));
}
```