¿Es excesivo ejecutar la prueba unitaria con Valgrind?


Hace solo unos días empecé a buscar en un marco de pruebas unitarias llamado check, y tengo la intención de ejecutar la prueba en código c bajo Linux.

Ahora verifique y un código bien diseñado y un código de prueba pueden ayudarme a verificar que la funcionalidad básica es correcta, Quiero decir que es bastante fácil simplemente mirar las variables en y la respuesta de nuevo y luego decide si una función es correcta o no.

Pero digamos que quiero probar una estructura de memoria dinámica con mucho malloc y libre, y resulta que puedo poner datos y obtener datos correctos de nuevo. Pero eso no prueba que no he roto algo de memoria en el proceso, digamos que olvidé liberar la mitad de la memoria y perdí los punteros (un memleak clásico). Ese código probablemente pasaría la mayoría de las pruebas unitarias.

Ahora la pregunta: ¿es una buena idea ejecutar todo el código de prueba de unidad con es decir, Valgrind y dejarlo ¿detecta algún problema de malloc / free? (O tal vez compilar en algo como ¿Cerca eléctrica?)

Se siente como una buena idea, pero no estoy seguro de en qué me estoy metiendo aquí.....

Gracias Johan


Actualización: Gracias Douglas y Jonathan, parece que esta es una buena idea y algo con lo que debería continuar: -)

Actualización: Valgrind es una herramienta divertida, sin embargo, los primeros memleaks que encontré haciendo esto estaba en el marco de prueba y no mi propio código (aunque es bastante divertido). Así que un consejo para el resto es verificar que el marco de prueba de unidad que está utilizando no tiene fugas, antes de voltear su propio código al revés. Un caso de prueba vacío era todo lo que se necesitaba en mi caso, desde entonces, nada más que el marco de pruebas unitarias se está ejecutando.

Author: sth, 2009-01-20

2 answers

Ciertamente lo hacemos - es mucho más fácil ejecutar valgrind contra las pruebas unitarias que con el programa completo.

También cualquier error de memoria se localiza en el área de código que la prueba unitaria está probando, lo que hace que sea más fácil de corregir.

Además, comprobar que lo has arreglado es más fácil, porque estás ejecutando la prueba unitaria no una prueba más complicada contra tu programa completo.

Si está ejecutando valgrind de forma automatizada, probablemente desee --error-exitcode=<number> [default: 0]

Especifica un código de salida alternativo para devolver si Valgrind reportó algún errores en la carrera. Cuando se establece en el valor predeterminado (cero), el valor devuelto de Valgrind siempre será el valor de retorno del proceso siendo simular. Cuando se establece en un distinto de cero valor, ese valor se devuelve en su lugar, si Valgrind detecta algún error. Este es útil para usar Valgrind como parte de un conjunto de pruebas automatizado, ya que facilita la detección de casos de prueba para que Valgrind ha reportado errores, solo por inspección de códigos de devolución.

Http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

 51
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-20 07:54:02

Como dijo Douglas Leeder, vale la pena ejecutar sus pruebas unitarias con cualquier software de diagnóstico que pueda poner las manos que se asegurará de que realmente funciona como se espera. Eso incluye no abusar de la memoria, por lo que usar valgrind es una buena idea.

Realmente quieres que tus pruebas unitarias prueben que tu código funciona.

No tiene que ejecutarlos bajo valgrind todo el tiempo , pero debe ser lo más trivial posible hacerlo, y debe hacerlo periódicamente (por ejemplo, después de big cambio).

 10
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-19 22:02:02