如何在二进制项目中使用 src 文件夹外部的模块,例如用于集成测试或基准测试?



我的项目的路径结构如下:

demo
├── benches
│   └── crypto_bench.rs
├── src
│   ├── main.rs
│   └── crypto.rs
├── Cargo.lock
└── Cargo.toml

crypto.rs包含一个带有实现的结构Cryptocrypto.rsmain.rs使用mod crypto;引用

如何在长凳文件夹中使用crypto_bench.rs中的crypto.rs

我尝试了各种extern cratemodsuperuse的变化。 我能在网上找到的所有示例都是针对带有lib.rs的库项目,当使用带有main.rs文件的项目时,这些"导入"不起作用。

这是一个字面上的答案,但实际上不要使用它

#![feature(test)]
extern crate test;
#[path = "../src/foo.rs"] // Here
mod foo;
#[bench]
fn bencher(_: &mut test::Bencher) {
println!("{:?}", foo::Thang);
}

事实上,这很可能不起作用,因为foo.rs中的代码需要来自不包含的其他文件的支持代码。


与其这样做,不如创建一个库。您拥有库的纯定义 - 一段希望在两个不同的可执行文件中使用的代码。你不必放弃拥有可执行文件,甚至不必创建单独的目录(参见同时包含库和二进制文件的 Rust 包?),但创建可重用的代码是制作优质代码的关键组成部分。

您的最终状态如下所示:

demo
├── Cargo.lock
├── Cargo.toml
├── benches
│   └── crypto_bench.rs
├── benchmarks
└── src
├── bin
│   └── main.rs
├── crypto.rs
└── lib.rs

将可重用代码移动到库中:

src/lib.rs

pub mod crypto;

src/crypto.rs

pub struct Crypto;
impl Crypto {
pub fn secret() {}
}

然后从基准测试和二进制文件导入库:

长凳/crypto_bench.rs

#![feature(test)]
extern crate test;
use demo::crypto::Crypto;
use test::Bencher;
#[bench]
fn speedy(b: &mut Bencher) {
b.iter(|| Crypto::secret());
}

src/bin/main.rs

use demo::crypto::Crypto;
fn main() {
Crypto::secret();
eprintln!("Did the secret thing!");
}

然后,您可以通过不同的方式运行它:

$ cargo build
Compiling demo v0.1.0 (/private/tmp/example)
Finished dev [unoptimized + debuginfo] target(s) in 0.51s
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/main`
Did the secret thing!
$ cargo +nightly bench
Compiling demo v0.1.0 (/private/tmp/example)
Finished release [optimized] target(s) in 0.70s
Running target/release/deps/my_benchmark-5c9c5716763252a0
running 1 test
test speedy ... bench:           1 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 0 filtered out

另请参阅:

  • 同时包含库和二进制文件的 Rust 包?
  • 为集成测试和基准测试提供共享实用程序函数的惯用方法是什么?
  • 我可以仅出于集成测试和/或基准测试公开对象吗?
  • 无法在集成测试中导入模块

最新更新