2009-06-16 10 views
5

¿Alguien conoce las extensiones de CppUnit que se pueden usar para realizar afirmaciones en una prueba por prueba con respecto a fugas de memoria.Uso de CppUnit para la detección de fuga de memoria

es decir, CPPUNIT_ASSERT_NO_LEAKS()?

Básicamente, quiero poder pasar pruebas específicas cuando la ejecución de la prueba da como resultado una pérdida de memoria.

Respuesta

0

No tengo idea de eso, pero podrías usar algo como el código de Fluid Studios Memory Manager y engancharte con algunos ajustes. O eso o compílelo en su aplicación de prueba y luego tenga una secuencia de comandos que ejecute la aplicación una vez para cada prueba y coteje los resultados del seguimiento de la memoria.

4

Si está ejecutando en Linux, puede ejecutar sus pruebas con memcheck.

La sección Client Requests del manual describe varias macros útiles, de los cuales uno se observa como siendo útiles para la prueba:

VALGRIND_COUNT_LEAKS: llena los cuatro argumentos con el número de bytes de memoria encontrado por la anterior verificación de fugas para filtrar, dudoso, alcanzable y suprimido. De nuevo, es útil en el código de arnés de prueba, después de llamar al VALGRIND_DO_LEAK_CHECK.

La macro se define en memcheck.h (probable en /usr/include/valgrind), y la secuencia que desea se parecerán

unsigned long base_definite, base_dubious, base_reachable, base_suppressed; 
VALGRIND_DO_LEAK_CHECK; 
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed); 
// maybe assert that they're zero! 

// call test 

unsigned long leaked, dubious, reachable, suppressed; 
VALGRIND_DO_LEAK_CHECK; 
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed); 
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked); 
// etc. 

Repitiendo que en cada ensayo sería un dolor, por lo que podría escribir macros de su propio o, mejor aún, un especializado TestRunner.

+0

Esto no falla una prueba específica basada en fugas de memoria ... –

+0

Gracias, debería haber estado más claro. ¡Revisado! –

3

CPPUNIT no tiene compatibilidad con las comprobaciones de fugas de memoria.

El proyecto se ha recondenado ahora (se detuvo durante un tiempo prolongado) y esta puede ser una característica de CPPUNIT2, puede proponer (o escribir) a los autores.

Si está buscando un marco de prueba de Unidades con soporte de detección de fugas de memoria, puede intentar consultar CppUTest. Es el proyecto utilizado por Martin Fowler y Bob Martin en algunos cursos de TDD. Es bastante bueno

+0

CppUTest es algo que no había visto antes ... ¡gracias! Parece que hay un soporte rudimentario para las pruebas de memoria allí. Mirando en CppUnit 2 documentos ahora ... –

0

Ejecute sus pruebas unitarias con valgrind. El marco de prueba de la unidad que utilizo le permite ejecutar una o más pruebas de unidades individuales para que pueda detectar cuál está causando la fuga.

2

En Windows sería un asunto muy sencillo de utilizar algunas llamadas al montón de depuración para obtener CPPUnit para actuar sobre esta información utilizando _CrtMemCheckpoint() y _CrtMemDifference():

hay inconvenientes :

  • tendrías que colocar algo manualmente al comienzo de la prueba para obtener el punto de control (Tal vez hay una manera de integrar eso en CPPUnit de alguna manera)
  • es sólo para Windows (es probable que haya algo similar en los demás plataformas)
  • que sólo va a trabajar para construye con la depuración CRT
0

I Sé que no es CppUnit, pero boost :: test puede hacer detección de fuga de memoria.

De http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html:

void detect_memory_leaks(bool on_off);

void break_memory_alloc(long mem_alloc_order_num);

+2

Esta pieza de la página enlazada debe tenerse en cuenta: "Desafortunadamente esta característica es, por el momento, implementada solo para la familia de compiladores de Microsoft (e Intel, si emplea Microsoft C Runtime Biblioteca). Tampoco se puede ajustar por instancia del monitor y solo se activa globalmente y se informa después de que se ejecuta todo el programa. En un futuro, esto debería mejorarse ". – DevSolar

1

Donde trabajo construimos nuestras pruebas unitarias con purificar. Entonces, nuestra plataforma de integración continua extrae tanto el número de casos de prueba que tuvieron éxito/fallaron como el número de bytes filtrados (+ pelusa y resultados de cobertura) y lo muestra en una página web. Recomiendo encarecidamente hacerlo de esta manera.

Disculpe por no proporcionar la solución que deseaba.

Cuestiones relacionadas