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