Question

J'ai récemment essayé de créer des tests unitaires pour du code hérité.

J’ai choisi d’utiliser l’éditeur de liens pour me montrer quelles fonctions étaient la cause d’erreurs de lien, en recherchant la définition par la source et en créant une souche à partir de celle-ci.

Y a-t-il un moyen plus facile? Existe-t-il une sorte d’analyseur C ++ pouvant me donner des définitions de classe, sous une forme facile à utiliser, à partir de laquelle je peux générer des stubs?

Était-ce utile?

La solution

Vous voudrez peut-être examiner http: //os.inf.tu -dresden.de/vfiasco/related.html#parsing . Mais l'analyse en C ++ est difficile.

D'autre part, peut-être que ctags ou quelque chose de similaire peut extraire les définitions de classe ...

Vous pouvez également essayer d'écrire votre propre analyseur simple (?) pour générer des stubs de classe à partir de fichiers d'en-tête ...

J'ai essayé de vous donner des indications. Comme vous le voyez, le problème n’est pas facile. Mais espérons que vous pourrez automatiser au moins une partie de celle-ci.

Autres conseils

Gcc XML est utilisé dans certains projets, tels que FFI automatique pour Common Lisp. Il est relié au compilateur G ++ pour générer du XML représentant la source. À partir de là, tout outil de traitement XML pourrait vous aider à atteindre votre objectif.

L'outil abi-compliance-checker peut être utilisé comme analyseur syntaxique de C Fichiers d'en-tête / C ++:

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml
Le fichier d'entrée

VER.xml est le suivant:

<version>
  1.0
</version>

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

Le fichier de sortie api.xml contient les signatures de fonction et d'autres informations provenant de fichiers d'en-tête sous la forme structurée:

...
<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>
...

Voir aussi les informations sur l'outil api-sanity-checker , permettant de générer des Cas de test unitaires pour chaque fonction de l'API via l'analyse des déclarations dans les fichiers d'en-tête.

http://clang.llvm.org/ semble prometteur mais incomplet.

http://www.boost.org /doc/libs/1_36_0/libs/python/pyste/index.html utilise GCCXML pour générer des wrappers pour le code C ++ permettant d'interfacer python. Cela prouve que GCCXML a été utilisé pour un concept similaire.

Si vous êtes sur une plate-forme qui utilise le format de débogage DWARF (principalement UNIX), vous pouvez utiliser libdwarf pour analyser les informations de débogage et extraire des informations sur tout (prototypes de fonctions, définitions de classes, etc.). Beaucoup plus structuré et plus facile à analyser que C ++.

doxygen peut généralement analyser suffisamment de C ++ pour créer une documentation pour le code. Il possède également une option de sortie XML.

Avez-vous consulté Mockcpp , AMOP et mockpp ? Vous pouvez voir comment ils analysent le C ++ - si aucun d’entre eux ne correspond à vos besoins.

Le projet Eclipse CDT fournit un analyseur C ++ avancé. L'interface est assez simple. L'extrait de code suivant peut donner suffisamment d'indices.

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

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

scroll top