整合性テスト

ユニットテストは独立した一つのモジュール上で実行されます。これはプライベート なコードをテストするには必要です。整合性テストはクレートの外にあり、他のコードがそうで あるように、パブリックなインターフェースだけにアクセスできます。これはライブラリの いろいろな部分が適切に動くかテストするのに使います。

Cargoは整合性テストをsrcの隣のtestsディレクトリに置くことを想定しています。

ファイルsrc/lib.rs:

// このクレートadderは呼び出されることを想定しているため、整合性テストで
// 正しく動くか確認する。
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

テスト用ファイルtests/integration_test.rs:

// 他のコードがするように、テストするクレートを持ってくる
extern crate adder;

#[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ディレクトリ内の各コードは異なるクレートとしてコンパイルされます。整合性 テスト間でコードを共有したいときはパブリック関数を持つモジュールを定義し、それを インポートします。

ファイルtests/common.rs:

pub fn setup() {
    // 必要なファイルやディレクトリを作る、サーバーを起動する
    // などの必要なセットアップを記述する。
}

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

// 他のコードがするように、テストするクレートを持ってくる
extern crate adder;

// commonモジュールをインポートする。
mod common;

#[test]
fn test_add() {
    // common内のコードを実行する
    common::setup();
    assert_eq!(adder::add(3, 2), 5);
}

このようなコードのモジュール階層は普通のモジュールの規則と同じであるため、 tests/common/mod.rsのような場所に作ってもOKです。