Unit testing 根据代码记录单元测试

Unit testing 根据代码记录单元测试,unit-testing,doxygen,Unit Testing,Doxygen,我试图使用doxygen来记录我的单元测试,但我希望将它们与代码一起记录,而不是记录在测试头中,以减少进行类似测试时的复制/粘贴错误。当然,我使用的是RTF输出格式 /** @brief A method for testing doxygen method documentation * @test * -#Step 1 * -#Step 2 * -#Step 3 */ [TestMethod()]

我试图使用doxygen来记录我的单元测试,但我希望将它们与代码一起记录,而不是记录在测试头中,以减少进行类似测试时的复制/粘贴错误。当然,我使用的是RTF输出格式

    /** @brief A method for testing doxygen method documentation
     * @test
     *     -#Step 1
     *     -#Step 2
     *     -#Step 3
     */
    [TestMethod()]
    public void DoxygenScratchPadInHeader()
    {
        // code that may or may not be in sync with header
    }

    /** @brief A method for testing doxygen method documentation
     * @test
     */
    [TestMethod()]
    public void DoxygenScratchPadInLine()
    {
        /// @par
        ///     -#  Initialize the value to 0
        int i = 0;

        /// @par
        ///     -# Add a number
        i += 3;

        /// @par
        ///     -# Assert that the number is three
        Assert.AreEqual(3, i);
    }
测试列表输出:

成员UpdateProtocolQATests.CUpdateProtocolTest.DoxygenScratchPadInHeader()

  • 第一步
  • 步骤2
  • 步骤3
  • 成员更新ProtocolQatests.CUpdateProtocolTest.DoxygenScratchPadInLine()

    {注意这里没有步骤}

    功能描述输出:

    void UpdateProtocolQATests.CUpdateProtocolTest.DoxygenScratchPadInHeader()

    用于测试强氧剂方法文档的方法。 测试:

  • 第一步
  • 步骤2
  • 步骤3
  • void UpdateProtocolQATests.CUpdateProtocolTest.DoxygenScratchPadInLine()

    用于测试强氧剂方法文档的方法。 测试:

    {将最后一位显示为代码,因为stackoverflow正在更正重复的1.0到1.2.3…这是我最终真正想要的…}


    对于实现在线测试步骤文档有更好的想法吗?我不太关心测试列表中没有出现的步骤,我们可以只使用对函数的引用。

    使用支持从内联注释生成文档的工具:


    Doxygen有,这就是NaturalDocs的编写方法。

    我很同情您的困境,但据我所知,Doxygen实际上只是设计用于记录特定的代码对象(文件、类、名称空间、变量等),而不是任意代码行

    目前,我能想到的绕过这个缺点的唯一可能性是生成注释,其中包含您希望通过文档记录的实际代码

    我可以想出两种方法来实现这一点:

  • 在DOXY注释中放入某种特殊字符串(例如,
    DOXY\u INLINE\u code
    ),该字符串应与一行代码关联。然后编写一个筛选器(请参阅),将此字符串替换为
    \code\endcode
    ,其中
    是筛选器看到的下一行代码。我不确定Doxygen会把这些评论放在哪里,或者它们会是什么样子;不幸的是,它们可能相当丑陋。(我不喜欢的一个奇怪行为是,
    \code
    命令似乎会去掉前导空格,因此缩进无法正常工作。)
  • 编写一个“Doxygen runner”,在调用
    Doxygen
    之前,它将自动从代码生成
    .dox
    文件。这些自动生成的
    .dox
    文件将包含从相应的
    .cpp
    或其他源文件生成的文档。您可以使用各种Doxygen命令来编写实际源代码的文档,也可以在源代码文档中编写
    .dox
    文档(反之亦然)

  • 这些都是黑客行为,为了使Doxygen能够很好地处理这个案例,您必须对其进行大量的修改,但我希望这些建议能有所帮助。祝你好运。(我目前正在做一些类似的事情,让Doxygen很好地记录Google测试,这也是在一个高度监管的行业项目的背景下。)

    我记得在寻找类似解决方案时遇到过这个问题。我想记录用户测试过程,使其尽可能接近相应的单元测试或单元测试组。以下是我们使用强氧组/子组实现的解决方案的子集

    定义了一个单独的
    manual test.dox
    文件,以创建一个顶级组和几个子组,在这些子组下收集特定的手动测试

    /**
    @defgroup manualtest Manual Testing Instructions
    @{
    This section contains a collection of manual testing...
    
    @defgroup menutest Menu Tests
    
    @defgroup exporttest Import/Export Tests
    
    @}
    */
    
    下面显示了一个Java单元测试类的示例,其中包含单元测试文档和手动测试说明

    public MenuTests {
       ...
    
       /**
        * @addtogroup menutest
        * **Open File Test**
        * 
        * The purpose of this test is to...
        *
        * -# Do something
        * -# Verify something
        */
       /**
        * This unit test verifies that the given file can be created via
        * the File->Open... menu handler. It...
        */
       @Test
       public void open_file_test() {
          ...
       }
    }
    
    生成的HTML文档将包括一个手动测试说明页面 在模块部分下。所述页面将包含
    手动测试.dox中给出的标记详细信息,以及指向每个已定义子组的模块页面的链接,例如菜单测试

    菜单测试页面将显示添加到此菜单的所有手动单元测试步骤 子组,从而提供可包含的单独文档 作为软件测试计划或用户测试计划的一部分进行引用

    唯一需要注意的是,没有办法明确定义将测试指令添加到组中的顺序。在单个类中定义时,将按照定义的顺序添加它们,并按字母顺序解析多个类


    对于需要更多控制测试收集方式的项目,使用Doxygen创建XML输出。测试用例是使用XSLT模板提取的,并根据需要进行排序,但这本身就是另一个问题。

    有时需要满足监管要求。FDA并不擅长理解清晰的代码,他们有时希望所有内容都以段落形式列出。我的测试代码不到十行,开发人员很容易理解,但非开发人员不一定理解。这种注释行数多于代码行的模式在我合作过的医疗器械公司中是相当标准的;我想我们都读过关于Therac-25的书。很抱歉没有建设性的评论。是的,我从未构建过如此关键的组件,但我们必须仔细记录该组件没有那么关键的事实,并记录和测试代码,以使FDA对我们的工作有足够的信心。客户需要Doxygen。另一个工具不是一个选项。
    public MenuTests {
       ...
    
       /**
        * @addtogroup menutest
        * **Open File Test**
        * 
        * The purpose of this test is to...
        *
        * -# Do something
        * -# Verify something
        */
       /**
        * This unit test verifies that the given file can be created via
        * the File->Open... menu handler. It...
        */
       @Test
       public void open_file_test() {
          ...
       }
    }