Разбор на C++ за генериране на модулни тестове

Наскоро се опитвах да създам единици тестове за някакъв наследен код.

Възприемам подхода да използвам линкера, за да ми покаже кои функции причиняват грешки при връзката, като преглеждам източника, за да намеря дефиницията и създавам мъниче от това.

Има ли по-лесен начин? Има ли някакъв вид анализатор на C++, който може да ми даде дефиниции на класове в някаква лесна за използване форма, от която мога да генерирам мъничета?


person Dave Hillier    schedule 25.10.2008    source източник


Отговори (9)


Може да искате да проучите http://os.inf.tu-dresden.de/vfiasco/related.html#parsing. Но разборът на C++ е труден.

От друга страна, може би ctags или нещо подобно може да извлече дефиниции на класове...

Можете също да опитате да напишете свой собствен прост (?) анализатор, за да генерирате мъничета на класове от заглавни файлове...

Опитах се да ви дам някои насоки. Както виждате, проблемът не е лесен. Но се надяваме, че можете да автоматизирате поне част от него.

person Paweł Hajdan    schedule 25.10.2008
comment
Добър отговор, но изглежда доста стар. Някой знае ли по-актуални източници? - person Dave Hillier; 25.10.2008

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

person Dwight Holman    schedule 25.10.2008

Инструментът 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 чрез анализ на декларациите в заглавните файлове.

person linuxbuild    schedule 22.09.2012

http://clang.llvm.org/ изглежда обещаващо, но е непълно.

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

person Dave Hillier    schedule 25.10.2008
comment
Отговорът може да е остарял от 2008 г. Вижте eli .thegreenplace.net/2011/07/03/parsing-c-in-python-with-clan за по-съвременен преглед на тази способност на clang. - person anatoly techtonik; 27.01.2015

Ако сте на платформа, която използва DWARF формат за отстраняване на грешки (предимно UNIX), можете да използвате libdwarf за анализиране на информация за отстраняване на грешки и извличане на информация за всичко (прототипи на функции, дефиниции на класове и т.н.). Много по-структуриран и по-лесен за анализиране от C++.

person zvrba    schedule 25.10.2008

doxygen обикновено може да анализира достатъчно C++, за да създаде документация за кода. Освен това има опция за XML изход.

person CesarB    schedule 25.10.2008

Разгледахте ли Mockcpp, AMOP и mockpp ? Можете да видите как анализират C++ - ако никой от тях не отговаря на вашите нужди.

person philant    schedule 08.12.2008

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

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

IStructure структура = (IStructure) елемент;
IMethodDeclaration[] методи = структура.getMethods();
IField[] поле = структура.getFields();

person Community    schedule 13.12.2008

Ако сте на платформата Windows, може да искате да разгледате проекта на Microsoft Phoenix . Това е нова рамка на компилатор, която ви позволява да се включите във всеки етап от процеса на компилиране.

person Ferruccio    schedule 25.10.2008