統合テストを記述する
単体テストとドキュメント テストでは、簡潔で具体的なテストが提供されます。 しかし、クレート全体をテストするのも良い方法です。 その後、クレートのさまざまなコード パーツが期待したとおり一緒に機能するのを確認できます。
クレート全体をテストするには、"統合テスト" を使用できます。 Rust テスト スイートでは、この種のテストがサポートされています。この種類のテストでは、ライブラリのパブリック API に含まれる関数だけが呼び出されます。 統合テストを使用して、他のユーザーが使用している場合のコードの動作を確認できます。
これらのテストは、個別のディレクトリとファイルに存在するため、ライブラリ コードを外部でテストできます。 Cargo で統合テストを実行する場合は、それらを tests ディレクトリに配置します。 Cargo によってこのディレクトリ内の各ソース ファイルが実行されます。 src ディレクトリと同じレベルで、プロジェクト ディレクトリ内に tests を作成します。
新しい小規模なプロジェクトを作成して、統合テストを作成してみましょう。 ターミナルで次のコマンドを実行します。
$ cargo new --lib rusty_pizza
$ cd rusty_pizza
この例では、プライベート メソッドとパブリック メソッドを含む単純な Pizza
構造体を使用します。
pub struct Pizza {
pub topping: String,
pub inches: u8,
}
impl Pizza {
pub fn pepperoni(inches: u8) -> Self {
Pizza::bake("pepperoni", inches)
}
pub fn mozzarella(inches: u8) -> Self {
Pizza::bake("mozzarella", inches)
}
fn bake(topping: &str, inches: u8) -> Self {
Pizza {
topping: String::from(topping),
inches,
}
}
}
前のスニペットには、ピザの準備にプライベート メソッド Pizza::bake
を使用する 2 つのパブリック メソッド Pizza::pepperoni
と Pizza::mozzarella
を持つ Pizza
構造体があります。
src
ディレクトリと共に、tests
という名前の新しいディレクトリを作成します。 その中に、次の内容を含む pizzas.rs
という名前の新しいファイルを配置します。
use rusty_pizza::Pizza;
#[test]
fn can_make_pepperoni_pizza() {
let pizza = Pizza::pepperoni(12);
assert_eq!(pizza.topping, "pepperoni");
assert_eq!(pizza.inches, 12);
}
#[test]
fn can_make_mozzarella_pizza() {
let pizza = Pizza::mozzarella(16);
assert_eq!(pizza.topping, "mozzarella");
assert_eq!(pizza.inches, 16);
}
これで、統合テストの設定が完了したので、cargo test
コマンドを実行して結果を確認できます。
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/pizzas-1996564f80b33a1e
running 2 tests
test can_make_mozzarella_pizza ... ok
test can_make_pepperoni_pizza ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests rusty_pizza
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
出力から、Rust によってテストの結果が個別のセクションに配置されることがわかります。 最初に単体テストの結果、次に統合の結果、最後にドキュメントの結果が表示されます。
統合テスト セクションでは、テスト スイートによって tests/pizzas.rs
ファイル内の 2 つのテストが収集され、実行されることがわかります。
バイナリ クレートでは、他のクレートで使用できる機能が公開されないため、統合テストを使用してテストできるのはライブラリ クレートだけです。 その結果、多くの Rust バイナリ クレートに、src/main.rs
のコードの大部分を含む src/lib.rs
ファイルが含まれます。 次に、統合テストで、use
を使用してクレートをライブラリとしてにインポートすることで、バイナリの機能をテストできます。