【问题标题】:Share common test code between multiple packages in rust在 rust 中的多个包之间共享通用测试代码
【发布时间】:2022-01-15 05:57:53
【问题描述】:

我有一些通用功能,我想在不同包中的 junit 测试中重用这些功能,但我不知道该怎么做。我尝试过使用不同的模块和库,但有些东西不起作用。我目前的结构看起来像这样:

.
├── Cargo.lock
├── Cargo.toml
├── foo
│   └── bar
│       └── baz
│           ├── template
│           │    ├── Cargo.lock
│           │    ├── Cargo.toml
│           │    └── src
│           │        └── tests
│           │            ├── mod.rs
│           │            └── test1.rs
│           │
│           └── template_implementation
│                 ├── Cargo.lock
│                 ├── Cargo.toml
│                 └── src
│                     └── tests
│                         ├── mod.rs
│                         └── test2.rs
│
└── utils
    └── testpackage
        ├── Cargo.toml
        ├── lib.rs
        └── common.rs

所以在common.rs 我有这样的东西:

/// setup for tests
pub fn setup() { ... }
pub fn mock_x() { ... }
pub fn mock_y() { ... }

lib.rs 看起来像这样:

#[cfg(test)]
pub mod common;

我想在test1.rstest2.rs 中使用common.rs 中的这些函数。我确保货物文件的依赖项是正确的,即使它们被 IDE “找到”,我在执行 cargo test 时收到错误,即在 testpackage 中找不到这些方法。

如果我从 mod 中删除 #[cfg(test)] 它“有效”,但我不希望在执行 cargo build 时包含它,此外我在运行测试时收到一堆警告,它甚至不编译然后是工件。

我尝试移动 common.rs,例如将其包含在 template 包中,但仍然无法正常工作,我面临类似的问题。不确定我是否遗漏了一些注释或什么,如果感觉像一个非常愚蠢的问题。

你会怎么做这样的事情?

【问题讨论】:

  • 这个问题与 JUnit 有什么关系?
  • 对,错标签
  • 这看起来像是一个非常规的 Rust 项目文件夹结构......你是在使用 Cargo 工作空间还是其他东西来管理它?
  • 我确实在使用 cargo,我有多个 crate 来分离关注点,这有什么不寻常的地方? @麦粒肿
  • 我发现嵌套级别非常规(foo/bar/baz/ 层在两个文件夹上方具有实际 crate 定义),但是你可能只是省略了不相关的代码库部分

标签: unit-testing testing rust rust-cargo


【解决方案1】:

只是一种预感(我没有尝试在那里重新创建您的文件夹结构,也从未尝试编译 #[cfg(test)] 库),但顺便说一下,您在工作区设置中处理了三个不同的 crate。在这种情况下,您的 testpackage 将(据我了解)仅作为伪外部依赖项包含在您的 templatetemplate_implementation 板条箱中。根据我对工作区构建过程的理解,将编译工作区子箱以进行调试或发布(但从不在测试配置中)以包含在工作区的其他子箱中,而 #[cfg(test)] 仅在以下范围内使用一个箱子。

【讨论】:

  • 这可能解释了为什么 IDE 找到它但无法运行测试......你将如何实现类似的东西呢?你有更好的方法吗?
  • 如果您想维护基本上完全独立的 crate 很难,在这种情况下,我认为您最好的选择是不要将 #cfg[test] 用于您的 utils crate,而是以一种方式设置它它仅作为dev-dependency 包含在其他板条箱中。不过,就我个人而言,我想知道您是否真的需要一个单独的 crate 结构,或者命名空间或功能标志是否可能已经无法充分解决关注点的分离,同时仍然允许与测试相关的代码驻留在同一个 crate 范围内
  • 感谢您的想法,将研究它。
猜你喜欢
  • 2021-05-15
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2019-12-13
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多