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



我有一个包含src/lib.rs的板条箱-0,如下所示:

#[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中。使crate-0开发依赖于crate-0-testutils;CCD_ 9依赖于CCD_;CCD_ 11 dev依赖于CCD_ 12,依赖于crate-0。

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

如果所有的创建都有这样的实用程序,那么这最多会使lib板条箱的数量增加一倍。

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

crate-0Cargo.toml中创建一个不依赖任何东西的功能:

[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.nnUse: cargo test --features testingnn");
}
}

只有当通过为其添加保护来启用该功能时,才编译实用程序:

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

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

避免在任何机箱范围的依赖声明中添加此功能。在crate-1的开发依赖关系中包括来自crate-0的测试功能,其中crate-1也对crate-0具有正常依赖关系,从而即使在发布模式下,也会为crate-1的构建目标构建具有该功能的crate-0

最新更新