testing - 如何在 Rust 中的测试和工作台之间共享代码?

标签 testing rust benchmarking source-sets

我开始在 Rust 中使用“bench”和 Rust nightly 编写基准测试,如文档中所写。
为了在测试和基准测试之间共享代码,我添加了 Option<&mut Bencher>并直接运行代码块或通过bencher(“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 稳定为基准。
"bencher" crate 3年没更新好像"criterion" crate是默认选项。为此,我必须将代码移动到“./benches/my_benchmark.rs”。
我怎么还能分享 block_requests(..)在测试和基准测试之间?

最佳答案

tests/benches/工作方式与 src/main.rs 相同或 src/bin/*.rs : 它们是单独的二进制 crate。这意味着它们必须按名称引用库 crate 中的项目,并且这些项目必须是可见的。
所以,你需要改变

fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
让它 pub lic,您可能还想添加 #[doc(hidden)]以便您的库文档不包含测试助手:
#[doc(hidden)]
pub fn block_requests(bencher_option: Option<&mut Bencher>, ...) {
然后,在您的测试和基准测试中,use通过给出你的箱子的名字。
use my_library_crate_name::block_requests;

fn bench_smth(...) {...}
(这里不能使用 use crate::block_requests 因为关键字 crate 指的是基准二进制包,而不是库包。)

关于testing - 如何在 Rust 中的测试和工作台之间共享代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66154023/

相关文章:

scala - 可以在对的 Seq 上更快地实现 reduceByKey 吗?

javascript - 如何使用 testcafe 获取表中一列的文本,然后将其 eql 断言为 "something"

python - 如何在 pytest_bdd 的另一个功能文件实现中重用一个功能文件实现的步骤定义?

android - Robotium - Eclipse 中的 API 错误

memory - 为什么原始部分不符合任何字节序?

reference - 不能借用为可变的,因为它也被借用为不可变的

ruby-on-rails - RoR 野外的 RSpec 和 Cucumber

rust - 用 Rust 处理 WebAssembly 中的闭包而不是使用忘记和泄漏内存有什么更好的方法?

Julia @btime 找不到内部函数

c# - C++ 比 C# 快多少?