【问题标题】:Is there some way to build Rust documentation that includes the test documentation strings?有没有办法构建包含测试文档字符串的 Rust 文档?
【发布时间】:2020-01-24 16:30:03
【问题描述】:

我们的测试方法将测试文档作为文档输出中的第一类对象。具体来说,它定义了每个行为测试所测试的规范。

在具有适当记录的测试的项目上运行 cargo doc 并不会产生从测试文档字符串派生的文档的方式,而且我看不到任何明显的方法可以使其在输出中包含测试文档字符串.

一个示例模块如下:

/// This function does some important stuff
pub fn working_fn() -> bool {
    true
}

#[cfg(test)]
mod tests {
    //! This is some important set of tests
    //!

    use super::*;

    /// The function should work
    #[test]
    fn it_works() {
        assert!(working_fn());
    }
}

我得到了公共 working_fn 的文档输出,但没有得到 tests 模块的文档输出。我理解另一个复杂的问题是测试是私有的,理想情况下我能够记录私有测试而不记录其他私有对象。

【问题讨论】:

  • @Shepmaster 对,请耐心等待,我学得很快,但不一定够快!编辑完成
  • @Shepmaster 是的,我希望该文档显示在某个地方 - 理想情况下是在标题为 Specification 的部分中,但我很现实地接受这可能只是几步之遥。跨度>

标签: unit-testing testing rust bdd rust-cargo


【解决方案1】:

您可以引入一个新功能标志,该标志可用于专门为文档目的处理测试。

将该功能添加到您的 Cargo.toml:

[features]
dox = []

在您的代码中使用功能标志。

  1. 如果测试正在运行,则编译 tests 模块提供了功能标志。
  2. 仅在未提供功能标志时标记#[test] 功能。 #[test] 属性自动暗示 #[cfg(test)],因此我们必须跳过它以允许函数存在。
/// This function does some important stuff
pub fn working_fn() -> bool {
    true
}

#[cfg(any(test, feature = "dox"))]
mod tests {
    //! This is some important set of tests
    //!
    use super::*;

    /// The function should work
    #[cfg_attr(not(feature = "dox"), test)]
    fn it_works() {
        assert!(working_fn());
    }
}

构建文档

cargo doc --document-private-items --features=dox

留意#[cfg(rustdoc)],这将使您无需使用自己的功能标志,但目前还不稳定。

另见:

理想情况下,我可以在不记录其他私有对象的情况下记录私有测试

您可以进行测试 pubpub(crate)

如果这不是一个选项,我认为这将比它的价值更烦人。我知道的直接解决方案是按照How do I change a function's qualifiers via conditional compilation? 有条件地进行测试pub

【讨论】:

  • 这在我看来是基本问题的解决方法,但令人沮丧的是它有点受限(不是你的错!)。理想情况下,我想从rustdoc 内部获取文档的中间表示,所以看起来我需要继续思考......
  • @HenryGomersall 据我了解,由于您使用的是条件编译(#[cfg(...)]#[test]),没有文档的内部表示 -到 rustdoc 查看代码时,函数甚至都不存在。
  • 有趣,rustdoc 的输入来自哪里?
  • @HenryGomersall Rustdoc 实际上直接使用了 rustc 内部结构。 [...] 它运行编译器直到我们有一个 crate (HIR) 的内部表示并且能够运行一些关于项目类型的查询。 [...] librustdoc 执行两个主要步骤 [...] 1. 将 AST “清理”为更适合创建文档的形式 [...] 2. 使用此清理后的 AST 来呈现 crate 的文档,一页一次。 rustc guide
  • 那个链接很有趣。从cargo test --verbose 获取rustc 构建命令,并附加-Zunpretty=hir-tree 为我们提供了很可能是有用的HIR,我可以从中收集相关的点点滴滴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多