2008-10-25 10 views
10

Recientemente he estado intentando crear pruebas de unidades para algún código heredado.Análisis en C++ para generar resúmenes de prueba de unidades

He estado tomando el enfoque de usar el enlazador para mostrarme qué funciones causan errores de enlace, greping la fuente para encontrar la definición y crear un stub de eso.

¿Hay alguna manera más fácil? ¿Hay algún tipo de analizador de C++ que me pueda dar definiciones de clase, en alguna forma fácil de usar, desde la cual puedo generar stubs?

Respuesta

5

Es posible que desee investigar http://os.inf.tu-dresden.de/vfiasco/related.html#parsing. Pero el análisis de C++ es difícil.

Por otro lado, tal vez CTags o algo similar puede extraer las definiciones de clase ...

También puede intentar escribir su propio sencilla (?) Analizador para generar recibos de clase de archivos de cabecera ...

Intenté darle algunos consejos. Como puede ver, el problema no es fácil. Pero con suerte puedes automatizar al menos parte de él.

+0

Buena respuesta, pero parece bastante viejo. Alguien sabe de fuentes más actualizadas? –

4

Gcc XML se utiliza en algunos proyectos, como automatic FFI for Common Lisp. Vincula al compilador de G ++ para generar XML que representa la fuente. A partir de ahí, cualquier herramienta de procesamiento XML podría ayudarlo a alcanzar su objetivo.

0

Si está en la plataforma de Windows, es posible que desee echar un vistazo a Microsoft Phoenix project. Es un nuevo marco de compilación que te permite conectarte a cualquier etapa del proceso de compilación.

2

http://clang.llvm.org/ parece prometedor, pero está incompleto.

http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html usa GCCXML para generar envoltorios para código C++ a interfaz python. Esto demuestra que GCCXML se ha utilizado para un concepto similar.

+0

La respuesta podría estar desactualizada desde 2008. Ver http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clan para una visión más moderna de esta capacidad de clang. –

1

doxygen generalmente puede analizar lo suficiente de C++ para crear documentación para el código. También tiene una opción de salida XML.

2

Si está en una plataforma que usa el formato de depuración DWARF (principalmente UNIX), puede usar libdwarf para analizar información de depuración y extraer información sobre todo (prototipos de funciones, definiciones de clase, etc.). Mucho más estructurado y más fácil de analizar que C++.

1

¿Has mirado Mockcpp, AMOP y mockpp? Podrías ver cómo analizan C++, si ninguno de ellos se ajusta a tus necesidades.

1

El proyecto Eclipse CDT proporciona un analizador avanzado de C++. La interfaz es bastante fácil. El siguiente fragmento de código puede dar suficiente pista.

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

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

3

La herramienta abi-compliance-checker se puede utilizar como un analizador de archivos de cabecera C/C++:

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

VER.xml archivo de entrada es la siguiente:

<version> 
    1.0 
</version> 

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

La salida api.xml archivo contiene las firmas de función y otra información de archivos de encabezado en la forma estructurada:

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

Consulte también información sobre la herramienta api-sanity-checker, que puede generar casos de prueba de unidades básicas para cada función en la API mediante el análisis de declaraciones en archivos de encabezado.

Cuestiones relacionadas