我们可以在板条箱之间共享测试实用程序吗?

2024-05-28

我有 crate-0 有src/lib.rs如下:

#[cfg(test)]
pub mod test_utils {
    pub struct OnlyInTests(pub usize);
    pub fn helper() -> usize { 999 }

    #[test]
    fn test_0() { let _ = OnlyInTests(helper()); }
}

我还有 crate-1,我需要在 crate-0 中定义的测试框架:

extern crate crate_0;

#[cfg(test)]
pub mod test_utils {
    // This will error out - cannot find mod test_utils in crate_0
    use crate_0::test_utils::{OnlyInTests, helper()};

    #[test]
    fn test_1() { let _ = OnlyInTests(helper()); }
}

这里的代码很简单,可以复制粘贴,但实际上我有复杂的测试实用程序,我想在测试 crate-1 时使用它们。

我无法将测试实用程序分离到不同的板条箱中,因为我会收到循环依赖错误:test_utils将取决于crate-0创造东西和crate-0将取决于test_utils供测试用)。我实际上也不想这样做,因为接下来还有更多的板条箱,我想在依赖的板条箱中使用其测试实用程序。


两种解决方案的权衡截然不同:

单独的公用设施板条箱

将您的测试实用程序而不是测试放入新的箱子中crate-0-testutils. Make crate-0开发依赖crate-0-testutils; crate-0-testutils取决于crate-0; crate-1开发依赖crate-0-testutils并依赖于 crate-0。

这不会创建循环依赖关系,因为开发依赖关系不会传播。由于开发依赖性,您在 crate-0 中的测试仍然可以使用 crate-0-testutils 中的内容。

如果您的所有创建都具有此类实用程序,则这最多会使您的库箱数量增加一倍。

在所有板条箱中使用测试功能

在中创建一个特征Cargo.toml ofcrate-0这不依赖于任何东西:

[features]
testing = []

还有一在crate-1这取决于上述情况:

testing = ["crate-0/testing"]

然后,在未启用该功能时,使每个板条箱上的第一次测试失败,以便更容易理解错误:

#[cfg(all(not(feature = "testing"),test))]
mod testusage {
    #[test]
    fn panic_without_testing_feature() {
        panic!("Please use the feature testing when running tests.\n\nUse: cargo test --features testing\n\n");
    }
}

仅当通过为其添加防护来启用该功能时才编译实用程序:

#[cfg(feature = "testing")]
fn testing_utility() {
}

无论它依赖多少个测试功能,这只会在每个包中添加一个功能,但缺点是需要特殊调用测试。

避免在任何 crate 范围的依赖声明中添加此功能。包括来自的测试功能crate-0在开发依赖性中crate-1 where crate-1也有正常的依赖crate-0货物建造的结果crate-0即使对于构建目标也具有该功能crate-1即使在释放模式下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以在板条箱之间共享测试实用程序吗? 的相关文章

随机推荐

  • 如何设置“阅读文档”以使 Sphinx autodoc 选项发挥作用?

    我的项目不是使用 autodoc 构建的 我遇到了关于我的项目未在 autodoc 中构建的常见问题 https read the docs readthedocs org en latest faq html my project isn
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • Promise.any() 和 Promise.race() 有什么区别

    有什么区别Promise any and Promise race 以及它们如何以不同的方式使用 From MDN https developer mozilla org en US docs Web JavaScript Referenc
  • Powershell 中的反斜杠

    为什么 split 参数的字符串需要两个反斜杠 而 join 参数的字符串只需要一个反斜杠 反引号是 Powershell 中的转义字符 字符前面的反斜杠有什么作用 path C folder test unit1 testing resu
  • 为什么 setInterval 会无限循环

    我正在尝试设置一个计时器 以便它显示用户的秒数和分钟剩余时间 并且我正在使用setInterval获取秒数 如果有 60 秒 则会从用户处减少 1 分钟 问题是我变得无限for每次我尝试这样做时都会循环 就像是 var userObj na
  • 扩展授权属性

    我实施了 CustomAuthorization 属性基于 Authorize 属性 我的属性如下所示 public class CustomAuthorizeAttribute AuthorizeAttribute public eUse
  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • 如何添加没有值的属性

    我通过 html 助手和 TagBuilder 生成 HTML 文本框 我们有方法 TagBuilder Attributes Add key value 但对于 HTML5 required 属性不需要传递值 因此如果我传递空字符串 则输
  • RavenDB 和 SignalR Nuget 包依赖项冲突

    基本冲突 SignalR 希望 Newtonsoft Json 版本为 4 0 7 或更高版本 而 RavenDB 希望版本等于 4 0 5 这显然意味着它们不能并排安装 因此 除了从其中之一下载源代码并在本地计算出依赖项 然后必须签入从中
  • 尝试在谷歌地图V2 Android应用程序中获取空数组的长度

    我目前正在使用谷歌地图API开发一个Android应用程序 有时我会因为没有明显的原因而发生奇怪的崩溃 在我看来 这是崩溃日志 12 02 16 38 57 071 20796 21137 com appsolute ParkYoo E A
  • WebRTC/getUserMedia:如何正确静音本地视频?

    我正在尝试实现将本地视频静音的功能MediaStreamTrack在我的 WebRTC 应用程序中 我是这样处理的 function muteVideo if this localStream this localStream getVid
  • SPGridView、数据以及确保数据安全的正确方法

    我正在使用 SPGridView 来呈现一些数据 并启用了效果很好的过滤功能 直到您选择数据中的特定项目进行过滤 有问题的数据项在字符串中包含撇号 例如 这是 richards 的字符串 这会导致后过滤器应用程序页面加载因错误而终止 Syn
  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 如何为现代 C++ 迭代 JSON 中的 JSON

    我想迭代 json 对象中的每个条目 但我收到一个又一个难以理解的错误 下面的例子如何改正 include
  • 从命令调用操作

    我想通过自定义命令执行操作 Controller php类的forward方法提供了这个功能 但是不知道从命令文件的execute 方法访问它 由于请求堆栈的原因 使控制器成为服务将导致性能开销 因为它应该返回一个HttpResponse
  • Pandas:自定义类作为具有多索引的列标题

    我正在尝试使用对象作为多索引中的列标题 dataframe 但我似乎无法让它工作 eq hash and str 仅适用于简单的数据框 这是一个小例子 class Signal def init self name self name na
  • API Gateway HTTP 代理与 aws-sam 集成(不是 Lambda 代理)

    我正在尝试使用 aws sam 在本地开发 模拟我的 API 网关 我的 API 网关充分利用HTTP 代理集成 https docs aws amazon com apigateway latest developerguide api
  • 获取两个顶点之间的边属性值时出现 ClassCastException

    我正在尝试获取两个顶点之间的边缘属性值并低于异常 java lang ClassCastException 无法将 java lang String 转换为 scala runtime Nothing 环境 内存中的泰坦 Code val
  • QuerySet,对象没有属性id - Django

    我试图在 Django 中获取某个对象的 id 但不断收到以下错误 异常值 QuerySet 对象没有属性 ID 我在views py中的函数 csrf exempt def check question answered request
  • 我们可以在板条箱之间共享测试实用程序吗?

    我有 crate 0 有src lib rs如下 cfg test pub mod test utils pub struct OnlyInTests pub usize pub fn helper gt usize 999 test fn