インテグレーションテスト
ユニットテストは、独立したモジュールを一つずつテストするものであり、テストは小さく、プライベートなコードについてもテストすることができます。インテグレーションテストはクレートの外側にあるもので、他の外部のコードと同様に、パブリックなインタフェースだけを使います。インテグレーションテストの目的は、ライブラリのそれぞれのモジュールが連携して正しく動作するかどうかテストすることです。
Cargoは、src
ディレクトリと並んで配置されたtests
ディレクトリをインテグレーションテストとして扱います。
ファイルsrc/lib.rs
:
// Define this in a crate called `adder`.
// Assume that crate is called adder, will have to extern it in integration test.
// `adder`という名前のクレートの内部で、次の関数を定義する。
// インテグレーションテストでadderクレートをexternで宣言する。
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
テストを含むファイルtests/integration_test.rs
:
// extern crate we're testing, same as any other code would do.
// 他の外部のコードと同様に、テスト対象のクレートをexternで宣言する。
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
ディレクトリにあるRustのソースファイルは別のクレートとしてコンパイルされます。インテグレーションテストの間でコードを共有するには、パブリックな関数をモジュールに入れて、それぞれのテストでインポートして利用する方法があります。
ファイルtests/common.rs
:
pub fn setup() {
// some setup code, like creating required files/directories, starting
// servers, etc.
// 必要なファイル・ディレクトリの作成やサーバの起動といった準備を行うコードを記述する。
}
テストを含むファイルtests/integration_test.rs
:
// extern crate we're testing, same as any other code will do.
// 他の外部のコードと同様に、テスト対象のクレートをexternで宣言する。
extern crate adder;
// importing common module.
// 共通のモジュールをインポートする。
mod common;
#[test]
fn test_add() {
// using common code.
// 共通のコードを利用する。
common::setup();
assert_eq!(adder::add(3, 2), 5);
}
モジュールをtests/common.rs
に記述することも可能ですが、tests/common.rs
中のテストも自動的に実行されてしまうため非推奨です。