統合テスト

ユニットテストは、独立したモジュールを一つずつテストするものであり、テストは小さく、プライベートなコードについてもテストすることができます。統合テストはクレートの外側にあるもので、他の外部のコードと同様に、パブリックなインタフェースだけを使います。統合テストの目的は、ライブラリのそれぞれのモジュールが連携して正しく動作するかどうかテストすることです。

Cargoは、srcディレクトリと並んで配置されたtestsディレクトリを統合テストとして扱います。

ファイルsrc/lib.rs

// `adder`という名前のクレートの内部で、次の関数を定義します。
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

テストを含むファイルtests/integration_test.rs

#[test]
fn test_add() {
    assert_eq!(adder::add(3, 2), 5);
}

cargo testコマンドでテストを実行します。

$ cargo test
running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/integration_test-bcd60824f5fbfe19

running 1 test
test test_add ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests adder

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

testsディレクトリにあるRustのソースファイルは別のクレートとしてコンパイルされます。統合テストの間でコードを共有するには、パブリックな関数をモジュールに入れて、それぞれのテストでインポートして利用する方法があります。

ファイルtests/common.rs

pub fn setup() {
    // 必要なファイル・ディレクトリの作成やサーバの起動といった準備を行うコードを記述します。
}

テストを含むファイルtests/integration_test.rs

// 共通のモジュールをインポートします。
mod common;

#[test]
fn test_add() {
    // 共通のコードを利用します。
    common::setup();
    assert_eq!(adder::add(3, 2), 5);
}

モジュールをtests/common.rsに記述することも可能ですが、tests/common.rs中のテストも自動的に実行されてしまうため非推奨です。