Разбор C ++ для создания заглушек модульного теста

StackOverflow https://stackoverflow.com/questions/236086

Вопрос

Недавно я пытался создать модульные тесты для некоторого устаревшего кода.

Я использовал подход с использованием компоновщика, чтобы показать мне, какие функции вызывают ошибки ссылок, найти источник определения для определения и создать заглушку из этого.

Есть ли более простой способ? Есть ли какой-то синтаксический анализатор C ++, который может дать мне определения классов в некоторой простой в использовании форме, из которых я могу генерировать заглушки?

Это было полезно?

Решение

Возможно, вы захотите изучить http: //os.inf.tu. -dresden.de/vfiasco/related.html#parsing . Но анализ C ++ сложен.

С другой стороны, возможно, ctags или что-то подобное может извлечь определения классов ...

Вы также можете попробовать написать свой собственный простой (?) парсер для генерации заглушек классов из файлов заголовков ...

Я пытался дать вам несколько советов. Как видите, проблема не из легких. Но, надеюсь, вы сможете автоматизировать хотя бы часть этого.

Другие советы

Gcc XML используется в некоторых проектах, таких как автоматическая FFI для Common Lisp. Он связывается с компилятором G ++ для генерации XML, представляющего источник. Оттуда любой инструмент обработки XML может помочь вам достичь вашей цели.

Инструмент 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 с помощью анализа объявлений в заголовочных файлах.

http://clang.llvm.org/ выглядит многообещающе, но не полностью.

http://www.boost.org /doc/libs/1_36_0/libs/python/pyste/index.html использует GCCXML для генерации оболочек для кода C ++ для взаимодействия с Python. Это доказывает, что GCCXML использовался для аналогичной концепции.

Если вы используете платформу, использующую формат отладки DWARF (в основном UNIX), вы можете использовать libdwarf для анализа отладочной информации и извлечения информации обо всем (прототипы функций, определения классов и т. д.). Гораздо более структурированный и легче разбираемый, чем C ++.

doxygen обычно может анализировать достаточно C ++ для создания документации для кода. У этого также есть опция вывода XML.

Вы смотрели на Mockcpp , AMOP и mockpp ? Вы могли видеть, как они анализируют C ++ - если ни один из них не соответствует вашим потребностям.

Проект Eclipse CDT предоставляет расширенный синтаксический анализатор C ++. Интерфейс довольно прост. Следующий фрагмент кода может дать достаточно подсказки.

ITranslationUnit tu = CoreModelUtil.findTranslationUnit (file);
ICElement [] elements = tu.getChildren (); Элемент структуры

IStructure = (IStructure);
IMethodDeclaration [] method = structure.getMethods ();
IField [] field = structure.getFields ();

scroll top