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

2024-04-13

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

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

crypto.rs包含一个结构体Crypto与实施。crypto.rs被引用自main.rs using mod crypto;

我该如何使用crypto.rs from crypto_bench.rs在 benches 文件夹内?

我尝试过各种变体extern crate, mod, super and use。 我可以在网上找到的所有示例都是针对带有lib.rs当使用带有以下内容的项目时,这些“导入”不起作用main.rs file.


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

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

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

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

事实上,这很可能行不通,因为你的代码foo.rs需要来自其他不会包含的文件的支持代码。


而不是这样做,只需创建一个库。您拥有库的纯粹定义 - 一段想要在两个不同的可执行文件中使用的代码。您不必放弃可执行文件,甚至不必创建单独的目录(请参阅Rust 包同时包含库和二进制文件? https://stackoverflow.com/q/26946646/155423),但创建可重用代码是制作的关键组成部分good code.

你的最终状态看起来像:

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 包同时包含库和二进制文件? https://stackoverflow.com/q/26946646/155423
  • 为集成测试和基准测试提供共享实用函数的惯用方法是什么? https://stackoverflow.com/q/44539729/155423
  • 我可以公开对象仅用于集成测试和/或基准测试吗? https://stackoverflow.com/q/47698194/155423
  • 无法在集成测试中导入模块 https://stackoverflow.com/q/46867652/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 仅 mysqldump 模式,模式更新不丢失

    我正在考虑在提交更改之前使用 git pre commit hook 导出 MySQL 数据库模式 以便其他开发人员可以使用 git 存储库中的 SQL 脚本更新自己的数据库 默认情况下 mysqldump 我正在使用 no data 会在
  • 无法使用 @WebMvcTest 自动装配 MockMvc [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试在 Spring Boot 应用程序中测试我的 REST 控制器 这是我的测试课 import com binar ke
  • WCF服务操作名称

    有没有办法配置 App Insights 在监视 WCF 服务时收集操作名称 所有请求都通过 URL 只是以 svc 结尾的 POST 集中在一起 因此没有简单的方法来确定在服务上调用了哪个特定操作 是否需要一个自定义遥测初始化程序来以某种
  • 如何告诉 PyCharm 将生成的函数放在当前函数下方而不是上方?

    我有一个函数调用foo 在我里面main函数及对应函数foo尚不存在 我希望 PyCharm 使用如下所示的轻浆选项为我生成该函数 原则上它是有效的 但是 我希望生成新函数below main而不是在它之前 之上 gt 我如何告诉 PyCh
  • mPDF 不会在 pdf 文件上打印希伯来语

    我使用时遇到这个问题mPDF用希伯来语 这些是我正在使用的 mPDF 和 PHP 版本 PHP 5 6 25 mPDF 最新 这是我使用的 PHP 代码片段
  • 使用 PowerShell 的 Start-Process cmdlet 传递变量参数

    各位晚上好 我使用的命令行将参数作为变量传递给以下脚本 以便在我从此脚本中调用的另一个 ps1 中运行 每当我尝试从命令行传递参数时 我都会收到以下错误 Start Process 找不到接受的位置参数 争论 有人可以帮忙吗 感谢您抽出宝贵
  • 获取 JRuby jar 路径

    如同this https stackoverflow com questions 8743854 how to get the path of the jruby warbler jar file问题 我想知道如何获取当前jar文件的路径
  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 当 AJAX 向具有无效证书的服务器请求时如何抑制 SSL 错误

    我有这个代码 function newXMLHttpRequest var xmlHttp try xmlHttp new ActiveXObject Msxml2 XMLHTTP catch e try xmlHttp new Activ
  • 为什么我不能从 System.Object 中提取 ushort,然后将其转换为 uint? (C#)

    我正在操作列表中的项目System Management ManagementObjectCollection 这些项目中的每一个都是System Management ManagementObject其中包含按字符串索引的属性 看 for
  • 处理硬退回/投诉还是只是坚持黑名单?

    在这里向 NOOB 发送电子邮件 计划使用 Amazon SES 发送交易电子邮件 尝试了解如何处理退回邮件或被标记为垃圾邮件的电子邮件 SES 会自动将退回邮件 投诉收件人添加到黑名单中 我读到的有关禁止名单的内容 https sesbl
  • “User.count”没有改变 1 - Rails

    What User count didn t change by 1手段以及如何解决它 以下是控制台的命令行 这是我经历过的失败bundle exec rake test我正在寻找一种方法来修复它们 bundle exec rake tes
  • 如何等待WebViewBrush.Redraw()完成(UWP打印)?

    我有一个基本的 UWP 应用程序 带有嵌入式 WebView 可呈现相当大的 HTML 文档 最多 500 个字母大小的打印页面 我想添加对打印该 HTML 文档的支持 这是我的方法 为了支持分页 我使用 div style height
  • 类似heroku的git设置?

    说到 git 我是个菜鸟 我怎样才能得到它 这样我就可以做类似的事情git push production master并拥有我自己的远程存储库镜像 目前 每当我跑步时git push production master I get 错误
  • 闪亮反应性解释(使用 ObserveEvent)

    我希望使用下面的简化代码作为示例 清楚地了解 Shiny 的反应行为 当 y 在应用程序中更新时 图表也会更新 当 x 在应用程序中更新时 图表不会更新 我已阅读 Shiny 的教程 我的理解是 鉴于我已将 test 和plot 函数包装在
  • JQUERY - 单击后将 CSS 类添加到 BUTTON 元素 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我想在单击
  • 将对象转换为没有 TInterfacedObject 作为基类的接口类型

    我需要一个没有引用计数的实现接口的类 我做了以下事情 IMyInterface interface IInterface B84904DF 9E8A 46E0 98E4 498BF03C2819 procedure InterfaceMet
  • linq 查询和空值

    我想用 linq 查询一些 xml 文件 有一些必需的元素和一些可选的元素 仅需要名称 其他一切都是可选的 如果有一些 NULL 例如 cageCode NULL 它不会选择任何内容 我需要添加到字符串列表 我尝试了如下所示 但它不起作用
  • 如何使用 emacs/elisp 获取当前缓冲区信息的开始/结束?

    我有以下代码运行以范围输入的Figlet 如何修改此代码以检查 b 或 e 是否未指定 使 b 位于当前缓冲区的开头 e 位于当前缓冲区的结尾 defun figlet region optional b e interactive r s
  • 如何在二进制项目中使用 src 文件夹外部的模块,例如用于集成测试或基准测试?

    我的项目的路径结构如下 demo benches crypto bench rs src main rs crypto rs Cargo lock Cargo toml crypto rs包含一个结构体Crypto与实施 crypto rs