【问题标题】:Where should I put test utility functions in Rust?我应该将测试实用程序函数放在 Rust 的哪里?
【发布时间】:2019-06-16 04:37:34
【问题描述】:

我有以下代码定义可以放置生成文件的路径:

fn gen_test_dir() -> tempdir::TempDir {                                        
    tempdir::TempDir::new_in(Path::new("/tmp"), "filesyncer-tests").unwrap()   
} 

此函数在tests/lib.rs 中定义,用于该文件中的测试,我还想在位于src/lib.rs 的单元测试中使用它。

这是否可以在不将实用程序函数编译成非测试二进制并且不复制代码的情况下实现?

【问题讨论】:

  • 你不能把这个功能移到src/lib.rs,然后在tests/lib.rs中使用吗?
  • @DanielFath 我试过这个并用#[test] 注释以避免编译成发布二进制并收到此错误:“用作测试的函数必须具有签名 fn() -> ()”
  • 你可以尝试在非测试阶段输入#cfg(not(test)),这将删除你的代码。
  • 我想你的意思是#[cfg(test)]。我倾向于在我的 lib.rs(或子模块)中有一个 #[cfg(test)] mod tests,我将所有单元测试功能和它们需要的任何实用程序都放入其中。
  • @ChrisEmerson 啊,这似乎可行。如果你把它放在答案中,我可以标记它。

标签: unit-testing testing rust


【解决方案1】:

您可以从其他#[cfg(test)] 模块中导入您的#[cfg(test)] 模块,因此,例如,在main.rs 或其他一些模块中,您可以执行以下操作:

#[cfg(test)]
pub mod test_util {
    pub fn return_two() -> usize { 2 }
}

然后从您项目中的其他任何地方:

#[cfg(test)]
mod test {
    use crate::test_util::return_two;

    #[test]
    fn test_return_two() {
        assert_eq!(return_two(), 2);
    }
}

【讨论】:

  • Test mode(rustc --test 标志)似乎也为长凳启用了。但是,honggfuzz-rs 目标似乎没有启用它。
  • 由于某种原因这对我不起作用
【解决方案2】:

我所做的是将我的单元测试与任何其他实用程序一起放入一个受#[cfg(test)] 保护的子模块中:

#[cfg(test)]
mod tests {  // The contents could be a separate file if it helps organisation
    // Not a test, but available to tests.
    fn some_utility(s: String) -> u32 {
        ...
    }

    #[test]
    fn test_foo() {
        assert_eq!(...);
    }
    // more tests
}

【讨论】:

  • 集成测试怎么样?我需要与数据库集成,但我不想仅为测试创建依赖项。在我需要重用实用程序函数之前,集成测试对我的问题很有效。我想我会去创建一个 testutil crate...
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 2011-03-04
  • 2010-10-23
  • 2010-12-06
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多