检查 Rust 是否正在运行测试构建

wil*_*ire 3 rust

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

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

Pet*_*all 7

您可以使用cfg!(test)

if cfg!(test) {
    // do test stuff
} else {
    // do non-test stuff
}
Run Code Online (Sandbox Code Playgroud)

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

#[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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 看来 `cfg!(test)` 不适用于集成测试 (6认同)
  • 嗯,我不认为这个标志是使用 [integration testing](https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html) 约定来设置的。该示例使用私有函数,因此它不能作为 `lib` 进行外部测试。 (4认同)