TL;DR

ライブラリなどの複数の部品が、組み合わせたときに正しく動くかを確かめるテストである。外部のコードと同じように、公開されたインタフェースだけを使ってテストする。

なぜ必要か

The Rust Programming Language によると、単体では正しく動くコードも、組み合わせると問題が起きることがあるので、組み合わせたコードもテストで確かめる必要がある。単体テストは小さく焦点が絞られており、1 つのモジュールを切り離して、private なインタフェースもテストできる。統合テストは、1 つのテストで複数のモジュールを動かすことがある。

仕組み

Rust では、プロジェクトの最上位の tests/ ディレクトリに統合テストを置く。Cargo は tests/ の各ファイルを別々のクレートとしてコンパイルするので、テストするライブラリを use でスコープに入れる必要がある。テストからは、ライブラリの public な API しか呼べない。

例

use adder::add_two;
 
#[test]
fn it_adds_two() {
    let result = add_two(2);
    assert_eq!(result, 4);
}

注意点

src/main.rs だけを持つバイナリクレートは、他のクレートに関数を公開しないので、tests/ から統合テストを書けない。ロジックを src/lib.rs に置き、src/main.rs は薄いラッパーにしておくと、ライブラリとして統合テストできる。

Effective TypeScript 第2版 ―型システムの力を最大限に引き出す83項目 によると、型チェックは単体テストや統合テストより早く結果が出るので、できるだけ型チェックに任せたほうがよい。

関連

出典