我有一个Rust项目,包含集成测试(在/tests目录中)和基准测试(在/benches目录中)。我在测试和工作台中需要一些实用函数,但它们与我的crate本身无关,所以我不能把它们放在/utils目录中。处理这种情况的惯用方法是什么?
/tests
/benches
/utils
jjjwad0x1#
如注解中所述,创建一个新的crate。您不必将crate发布到crates.io。只需在项目中添加keep it as a local unpublished crate并将其标记为development-only dependency即可。这最好与版本2的Cargo解析器一起使用。要获得更好的性能,请考虑使用Cargo workspace。
. ├── Cargo.toml ├── src │ └── lib.rs ├── tests │ └── integration.rs └── utilities ├── Cargo.toml └── src └── lib.rs
货物清单
# ... [dev-dependencies] utilities = { path = "utilities" }
utilities/src/lib.rs
pub fn shared_code() { println!("I am shared code"); }
tests/integration.rs
extern crate utilities; #[test] fn a_test() { utilities::shared_code(); }
你可以在你的crate中放置一个模块,只有当一个特定的功能被传递时才被编译。这与用于单元测试的概念相同。这样做的好处是它可以访问库代码的内部。它的缺点是每次运行代码时都需要传递标志。这最好与版本2的Cargo解析器一起使用。
# ... [features] test-utilities = []
来源/lib.rs
#[cfg(feature = "test-utilities")] pub mod test_utilities { pub fn shared_code() { println!("I'm inside the library") } }
extern crate the_library; #[test] fn a_test() { the_library::test_utilities::shared_code(); }
执行
cargo test --features=test-utilities
这最好与版本2的Cargo解析器一起使用。
这对我来说太丑陋了,真的超出了正常的道路。
utilities.rs
pub fn shared_code() { println!("This is just sitting out there"); }
#[path = "../utilities.rs"] mod utilities; #[test] fn a_test() { utilities::shared_code(); }
另请参阅:
4xrmg8kj2#
您可以将这些实用程序函数添加到主crate中的pub模块中,并使用#[doc(hidden)]或#![doc(hidden)]属性将它们隐藏在docs-generator中。额外的评论将引导读者为什么他们在那里。
pub
#[doc(hidden)]
#![doc(hidden)]
anauzrmj3#
虽然这对基准测试没有帮助,但我来这里寻找一种方法来完成多个集成测试,后来发现您可以为集成测试做以下事情:具有公共代码的模块遵循普通模块规则,因此可以将公共模块创建为tests/common/mod.rs。来源:https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html
3条答案
按热度按时间jjjwad0x1#
创建共享crate(首选)
如注解中所述,创建一个新的crate。您不必将crate发布到crates.io。只需在项目中添加keep it as a local unpublished crate并将其标记为development-only dependency即可。
这最好与版本2的Cargo解析器一起使用。要获得更好的性能,请考虑使用Cargo workspace。
货物清单
utilities/src/lib.rs
tests/integration.rs
测试专用模块
你可以在你的crate中放置一个模块,只有当一个特定的功能被传递时才被编译。这与用于单元测试的概念相同。这样做的好处是它可以访问库代码的内部。它的缺点是每次运行代码时都需要传递标志。
这最好与版本2的Cargo解析器一起使用。
货物清单
来源/lib.rs
tests/integration.rs
执行
这最好与版本2的Cargo解析器一起使用。
使用任意文件路径的模块
这对我来说太丑陋了,真的超出了正常的道路。
utilities.rs
tests/integration.rs
另请参阅:
4xrmg8kj2#
您可以将这些实用程序函数添加到主crate中的
pub
模块中,并使用#[doc(hidden)]
或#![doc(hidden)]
属性将它们隐藏在docs-generator中。额外的评论将引导读者为什么他们在那里。anauzrmj3#
虽然这对基准测试没有帮助,但我来这里寻找一种方法来完成多个集成测试,后来发现您可以为集成测试做以下事情:
具有公共代码的模块遵循普通模块规则,因此可以将公共模块创建为tests/common/mod.rs。
来源:https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html