web-dev-qa-db-ja.com

Rust's Cargoのバイナリ用にテストを別のファイルに移動するにはどうすればよいですか?

Cargoを使用して新しいバイナリを作成しました。

cargo new my_binary --bin

my_binary/src/main.rsの関数をテストに使用できます。

fn function_from_main() {
    println!("Test OK");
}

#[test]
fn my_test() {
    function_from_main();
}

そして、cargo test -- --nocaptureは期待どおりにテストを実行します。

このテストを別のファイルに移動する最も簡単な方法は何ですか(function_from_mainmy_binary/src/main.rsに保持します)?

これを実行しようとしましたが、別のファイルからmy_testfunction_from_mainに呼び出す方法がわかりません。

13
ideasman42

Rustプログラミング言語 は、Rustについて学ぶ人々にとって素晴らしいリソースです。多くの基本的なトピックと多くの人々をカバーしています。改善のために多くの時間を費やしてきました。Rustに興味のある人は、よく読んでください。

テスト専用の章全体 ベースラインを理解するために読む必要があります。


単体テスト(コードの内部へのアクセスがより許可されているテスト)を特定の各ファイルのtestモジュールに配置するのが一般的です。

fn function_from_main() {
    println!("Test OK");
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn my_test() {
        function_from_main();
    }
}

モジュールは新しいファイルに移動できますが、これは単体テストモジュールでは一般的ではありません。

main.rs

fn function_from_main() {
    println!("Test OK");
}

#[cfg(test)]
mod test;

test.rs

use super::*;

#[test]
fn my_test() {
    function_from_main();
}

ファイルとモジュールが相互にマップする方法の詳細については、 モジュールを異なるファイルに分離する を参照してください。


別のファイルでのテストのより一般的なケースは、統合テストです。これらはまた、本の中で 木枠の外でのテストに専念するセクション によってカバーされています。これらのタイプのテストは、コードの実行に適していますコードのコンシューマーとして

ドキュメントのそのセクションには、紹介例と説明テキストが含まれています。

プロジェクトディレクトリの最上位のsrcの隣にtestsディレクトリを作成します。 Cargoは、このディレクトリで統合テストファイルを探すことを知っています。その後、このディレクトリに必要な数のテストファイルを作成でき、Cargoは各ファイルを個別のクレートとしてコンパイルします。

統合テストを作成しましょう。リスト11-12のコードがまだsrc/lib.rsファイルにある状態で、testsディレクトリを作成し、新しいtests/Integration_test.rsという名前のファイルを作成し、リスト11-13のコードを入力します。

ファイル名:tests/Integration_test.rs

use adder;

#[test]
fn it_adds_two() {
    assert_eq!(4, adder::add_two(2));
}

リスト11-13:加算器クレート内の関数の統合テスト

コードの先頭にuse adderを追加しましたが、これは単体テストでは必要ありませんでした。その理由は、testsディレクトリ内の各テストが個別のクレートであるため、ライブラリを各テストクレートのスコープに取り込む必要があるためです。

この関数はadder::add_twoとして呼び出されることに注意してください。 Rustのモジュールシステムの詳細については、 パッケージ、クレート、およびモジュールの章 を参照してください。

18
Shepmaster

あなたが正しい; function_from_mainmain.rsの外ではアクセスできません。

src/lib.rsを作成し、テストする関数を少しずつ移動する必要があります。これで、テストモジュールからextern crate my_binary;を使用して、関数をmy_binary名前空間の下に表示できるようになります。

2
Tobu

モジュールfoo.rsがあり、その隣にfoo_testというファイルのユニットテストを配置したい場合.rs、これは常にRustが子モジュールを探す場所ではないことがわかります。

#[path]属性を使用して、モジュールに対応するファイルの場所を指定できます。

#[cfg(test)]
#[path = "./foo_test.rs"]
mod foo_test;

これはブログ投稿で説明されています Rustでのユニットテストのより良い場所

0
mmai