如何在 Rust 中的测试和工作台之间共享代码?
How can one share the code between tests and benches in Rust?
我开始使用“bench”和 Rust nightly 编写 Rust 基准测试,正如文档中所写的那样。
为了在测试和基准测试之间共享代码,我添加了 Option<&mut Bencher>
并且 运行 代码块直接或通过 bencher passed ("src/lib.rs") :
fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
...
let mut block = || {
... // shared
}
match bencher_option {
// regular test
None => block(),
// benchmark
Some(bencher) => {
bencher.iter(block);
}
}
...
}
// call from test
#[test]
fn test_smth() {
block_requests(None, &requests, &mut matcher);
}
// call from benchmark
#[bench]
fn bench_smth(b: &mut Bencher) {
block_requests(Some(b), &requests, &mut matcher);
}
现在我想使用 Rust stable 作为基准测试。
因为 "bencher" crate is not updated for 3 years it seems that "criterion" crate 是默认选项。为此,我必须将代码移动到“./benches/my_benchmark.rs”。
我怎样才能在测试和基准测试之间共享 block_requests(..)
?
tests/
和 benches/
与 src/main.rs
或 src/bin/*.rs
的工作方式相同:它们是 独立的二进制包。 这意味着它们必须按名称引用您图书馆箱子中的项目,并且这些项目必须 可见。
所以,你需要改变
fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
使其成为 pub
lic,您可能还想添加 #[doc(hidden)]
以便您的库文档不包含测试助手:
#[doc(hidden)]
pub fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
然后,在你的测试和基准测试中,use
它通过给你的 crate 命名。
use my_library_crate_name::block_requests;
fn bench_smth(...) {...}
(您不能在此处使用 use crate::block_requests
,因为关键字 crate
指的是基准二进制包,而不是库包。)
我开始使用“bench”和 Rust nightly 编写 Rust 基准测试,正如文档中所写的那样。
为了在测试和基准测试之间共享代码,我添加了 Option<&mut Bencher>
并且 运行 代码块直接或通过 bencher passed ("src/lib.rs") :
fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
...
let mut block = || {
... // shared
}
match bencher_option {
// regular test
None => block(),
// benchmark
Some(bencher) => {
bencher.iter(block);
}
}
...
}
// call from test
#[test]
fn test_smth() {
block_requests(None, &requests, &mut matcher);
}
// call from benchmark
#[bench]
fn bench_smth(b: &mut Bencher) {
block_requests(Some(b), &requests, &mut matcher);
}
现在我想使用 Rust stable 作为基准测试。 因为 "bencher" crate is not updated for 3 years it seems that "criterion" crate 是默认选项。为此,我必须将代码移动到“./benches/my_benchmark.rs”。
我怎样才能在测试和基准测试之间共享 block_requests(..)
?
tests/
和 benches/
与 src/main.rs
或 src/bin/*.rs
的工作方式相同:它们是 独立的二进制包。 这意味着它们必须按名称引用您图书馆箱子中的项目,并且这些项目必须 可见。
所以,你需要改变
fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
使其成为 pub
lic,您可能还想添加 #[doc(hidden)]
以便您的库文档不包含测试助手:
#[doc(hidden)]
pub fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
然后,在你的测试和基准测试中,use
它通过给你的 crate 命名。
use my_library_crate_name::block_requests;
fn bench_smth(...) {...}
(您不能在此处使用 use crate::block_requests
,因为关键字 crate
指的是基准二进制包,而不是库包。)