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

Ant*_*ton 6 rust

我项目的路径结构如下:

demo
??? benches
?   ??? crypto_bench.rs
??? src
?   ??? main.rs
?   ??? crypto.rs
??? Cargo.lock
??? Cargo.toml
Run Code Online (Sandbox Code Playgroud)

crypto.rs包含Crypto带有实现的结构。 crypto.rs通过main.rs使用引用mod crypto;

如何crypto.rscrypto_bench.rs长椅文件夹中使用?

我已经尝试了各种变化extern cratemodsuperuse。我可以在网上找到的所有示例都是针对带有的图书馆项目,lib.rs并且在将带有main.rs文件的项目使用时,这些“导入”不起作用。

She*_*ter 9

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

#![feature(test)]
extern crate test;

#[path = "../src/foo.rs"] // Here
mod foo;

#[bench]
fn bencher(_: &mut test::Bencher) {
    println!("{:?}", foo::Thang);
}
Run Code Online (Sandbox Code Playgroud)

实际上,这很可能行不通,因为您的代码foo.rs需要支持其他文件中不包含的代码。


无需执行此操作,只需创建一个library即可。您具有库的纯定义-一段代码希望在两个不同的可执行文件中使用。您不必放弃拥有可执行文件,甚至不必创建单独的目录(请参阅带有库和二进制文件的Rust包?),但是创建可重用的代码是编写良好代码的关键组成部分。

您的最终状态如下所示:

#![feature(test)]
extern crate test;

#[path = "../src/foo.rs"] // Here
mod foo;

#[bench]
fn bencher(_: &mut test::Bencher) {
    println!("{:?}", foo::Thang);
}
Run Code Online (Sandbox Code Playgroud)

将可重用代码移至库中:

src / lib.rs

pub mod crypto;
Run Code Online (Sandbox Code Playgroud)

src / crypto.rs

pub struct Crypto;
impl Crypto {
    pub fn secret() {}
}
Run Code Online (Sandbox Code Playgroud)

然后从基准和二进制文件导入您的库:

长凳/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());
}
Run Code Online (Sandbox Code Playgroud)

src / bin / main.rs

use demo::crypto::Crypto;

fn main() {
    Crypto::secret();
    eprintln!("Did the secret thing!");
}
Run Code Online (Sandbox Code Playgroud)

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

demo
??? Cargo.lock
??? Cargo.toml
??? benches
?   ??? crypto_bench.rs
??? benchmarks
??? src
    ??? bin
    ?   ??? main.rs
    ??? crypto.rs
    ??? lib.rs
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 要添加到这个答案中,如果您的库板条箱类型专门是“cdylib”,您将收到“找不到`demo`的创建”编译错误 - 请参阅https://github.com/rust-lang /货物/问题/6659。为了使集成测试/基准测试正常工作,您需要将“(r)lib”添加到板条箱类型列表中。 (2认同)