インテグレーションテスト

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

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中のテストも自動的に実行されてしまうため非推奨です。