【问题标题】:Check if Rust is running a test build [duplicate]检查 Rust 是否正在运行测试构建 [重复]
【发布时间】:2019-10-06 14:23:57
【问题描述】:

我可以使用cfg!(debug_assertions) 检查 Rust 项目是否在开发模式下运行,但我想知道如何检查测试是否正在运行。我可以在if 语句中使用类似的测试标志吗?

原因是在运行集成测试时防止数据库写入。

【问题讨论】:

  • 为什么你没有一个具有 2 个实现的数据库操作的特征:模拟和生产操作?
  • @FrenchBoiethios 我愿意,这就是为什么我想通过检测它是否在测试中运行来检测使用哪一个。我也不嘲笑,因为它会减少集成测试。
  • @E_net4 可以在if 语句中使用吗? IE。 cfg!(test)。我没试过

标签: rust


【解决方案1】:

你可以使用cfg!(test):

if cfg!(test) {
    // do test stuff
} else {
    // do non-test stuff
}

但是,这可能会导致代码脆弱。例如,您可能不小心在生产环境中执行了某些代码,即使测试都通过了。在项目级别切换代码通常更健壮,如果你弄错了会导致编译错误:

#[cfg(test)]
impl Write for DB {
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
        // test stuff
    }

    fn flush(&mut self) -> Result<()> {
        // test stuff
    }
}

#[cfg(not(test))]
impl Write for DB {
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
        // actually write
    }

    fn flush(&mut self) -> Result<()> {
        // actually flush
    }
}

如果忘记实现not(test)版本,会出现编译错误。

【讨论】:

  • 这对我不起作用。你测试过这个吗?我很想知道它是否适合你
  • 是的,它对我有用,
  • 在操场上尝试:play.rust-lang.org/…
  • 嗯,我不认为这个标志是使用integration testing 约定设置的。该示例使用私有函数,因此不能作为lib 进行外部测试。
  • 看来cfg!(test) 不适用于集成测试
猜你喜欢
  • 2012-07-27
  • 2013-04-04
  • 2017-06-10
  • 2011-05-04
  • 2015-06-10
  • 1970-01-01
  • 2013-04-07
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多