## test]暗含`#[cfg(test)]`吗?

Luc*_*iel 4 testing attributes unit-testing visibility rust

按照惯例,Rust中的单元测试有一个单独的模块,该模块有条件地用#[cfg(test)]以下代码编译:

#[cfg(test)]
mod tests {
    #[test]
    fn test1() { ... }

    #[test]
    fn test2() { ... }
}
Run Code Online (Sandbox Code Playgroud)

但是,我一直在使用一种更内联测试的样式:

pub fn func1() {...}

#[cfg(test)]
#[test]
fn test_func1() {...}

pub fn func2() {...}

#[cfg(test)]
#[test]
fn test_func2() {...}
Run Code Online (Sandbox Code Playgroud)

我的问题是,#[test]暗示#[cfg(test)]吗?也就是说,如果我用#[test]而不是标记我的测试功能#[cfg(test)],那么在非测试版本中它们是否仍然正确存在?

Pet*_*all 5

我的问题是,#[test]暗示#[cfg(test)]吗?也就是说,如果我用#[test]而不是标记我的测试功能#[cfg(test)],那么在非测试版本中它们是否仍然正确存在?

是。如果您没有使用单独的模块进行测试,则无需使用#[cfg(test)]。标#[test]有的功能已从非测试版本中排除。这很容易验证:

#[test]
fn test() {}

fn main() {
    test(); // error[E0425]: cannot find function `test` in this scope
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现,在实践中,我创建了一些辅助函数和类型以彻底测试我的代码。那些受益于条件编译的嵌套“ test”模块。 (2认同)