解析C ++以生成单元测试存根

时间:2008-10-25 08:14:05

标签: c++ unit-testing parsing stub

我最近一直在尝试为一些遗留代码创建单元测试。

我一直在使用链接器的方法来向我展示哪些函数会导致链接错误,从而查找源代码以查找定义并从中创建存根。

有更简单的方法吗? 是否有某种C ++解析器能够以易于使用的形式为我提供类定义,我可以从中生成存根?

9 个答案:

答案 0 :(得分:5)

您可能需要调查http://os.inf.tu-dresden.de/vfiasco/related.html#parsing。但是C ++解析很难。

另一方面,也许ctags或类似的东西可以提取类定义......

您也可以尝试编写自己的简单(?)解析器,从头文件中生成类存根...

我试着给你一些指示。如你所见,问题并不容易。但希望你能至少自动完成其中的一部分。

答案 1 :(得分:4)

Gcc XML用于某些项目,例如automatic FFI for Common Lisp. 它与G ++编译器相关联,以生成表示源的XML。从那里,任何XML处理工具都可以帮助您实现目标。

答案 2 :(得分:3)

abi-compliance-checker工具可用作C / C ++头文件的解析器:

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml

VER.xml输入文件如下:

<version>
  1.0
</version>

<headers>
  /path1/to/header(s)/
  /path2/to/header(s)/
   ...
</headers>

输出api.xml文件包含结构化表单中头文件的函数签名和其他信息:

...
<symbol>
    <id>37348</id>
    <mangled>_ZN7MWidget11qt_metacallEN11QMetaObject4CallEiPPv</mangled>
    <short>qt_metacall</short>
    <class>13749</class>
    <header>mwidget.h</header>
    <line>45</line>
    <return>44</return>
    <spec>virtual</spec>
    <parameters>
        <param>
            <name>p1</name>
            <type>4078</type>
            <algn>4</algn>
            <pos>0</pos>
        </param>
        <param>
            <name>p2</name>
            <type>44</type>
            <algn>4</algn>
            <pos>1</pos>
        </param>
        <param>
            <name>p3</name>
            <type>3905</type>
            <algn>8</algn>
            <pos>2</pos>
        </param>
    </parameters>
</symbol>
...

另请参阅有关api-sanity-checker工具的信息,该工具可以通过分析头文件中的声明为API中的每个函数生成基本单元测试用例。

答案 3 :(得分:2)

http://clang.llvm.org/看起来很有希望但不完整。

http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html使用GCCXML为C ++代码生成包装器以连接python。这证明GCCXML已被用于类似的概念。

答案 4 :(得分:2)

如果您使用的是使用DWARF调试格式(主要是UNIX)的平台,则可以使用libdwarf来解析调试信息并提取有关所有内容的信息(函数原型,类定义等)。比C ++更结构化,更易于解析。

答案 5 :(得分:1)

doxygen通常可以解析足够的C ++来为代码创建文档。它还有一个XML输出选项。

答案 6 :(得分:1)

您是否看过MockcppAMOPmockpp?您可以看到它们如何解析C ++ - 如果它们都不符合您的需求。

答案 7 :(得分:1)

Eclipse CDT项目提供了高级C ++解析器。界面非常简单。 以下代码段可以提供足够的提示。

ITranslationUnit tu = CoreModelUtil.findTranslationUnit(file);
ICElement [] elements = tu.getChildren();

IStructure结构=(IStructure)元素;
IMethodDeclaration [] methods = structure.getMethods();
IField [] field = structure.getFields();

答案 8 :(得分:0)

如果您使用的是Windows平台,则可能需要查看Microsoft Phoenix project。它是一个新的编译器框架,可以让您挂钩到编译过程的任何阶段。