2009-01-19 11 views
32

Hace unos días comencé a buscar en un marco de prueba unitario llamado check, y tengo la intención de ejecutar la prueba en el código c en Linux.¿Es excesivo ejecutar la prueba unitaria con Valgrind?

Ya disponibilidad y algo de código bien diseñado y un poco de código de prueba puede ayudar a pasar por una verificación que la funcionalidad básica es correcta, quiero decir que es muy fácil de simplemente mirar las variables y la respuesta de la espalda y luego decidir si una función es correcta o no.

Pero digamos que quiero probar una estructura de memoria dinámica con un montón de malloc y libre, y resulta que puedo poner datos y obtener datos correctos de nuevo. Pero eso no prueba que no haya 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 pase la mayor parte de las pruebas unitarias.

Así que ahora para la pregunta: ¿es una buena idea ejecutar el código de la unidad de prueba completa, es decir, Valgrind y dejar que detecte cualquier malloc/free problems? (O tal vez se compilan en algo así como cerca eléctrica?)

Se siente como una buena idea, pero no estoy seguro de lo que estoy haciendo yo aquí .....

Gracias Johan


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

actualización: Valgrind es una herramienta divertida, sin embargo, las primeras memleaks que encontré haciendo esto estaban en el marco de prueba y no en mi propio código (aunque bastante gracioso). Así que un consejo para el resto es verificar que el marco de prueba de la unidad que está utilizando no esté goteando, antes de poner su propio código al revés. Un caso de prueba vacío era todo lo que necesitaba en mi caso, , ya que no se está ejecutando nada más que el marco de prueba de la unidad.

Respuesta

51

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 unidad de prueba está probando, lo que hace que sea más fácil de arreglar.

Además, comprobar que lo ha solucionado es más fácil, ya que está ejecutando la prueba de unidad no es una prueba más complicada en comparación con su programa completo.

Si está ejecutando valgrind de forma automatizada es probable que quieren --error-exitcode=<number> [default: 0]

Especifica un código de salida alternativa a volver si Valgrind reportó ningún errores en el funcionamiento. Cuando se establece en el valor predeterminado (cero), el valor de retorno de Valgrind siempre será el valor de retorno del proceso que es simulado. Cuando se establece en un valor distinto de cero , 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 hace que sea fácil detectar casos de prueba para que Valgrind ha informado de errores, simplemente mediante la inspección de códigos de retorno.

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

+0

También hay '--xml = yes' y' --xml-file = ', lo que facilita la automatización de la lectura de los resultados. –

10

Como se ha dicho Douglas Leeder, es bien vale la pena correr las pruebas unitarias con cualquier software de diagnóstico que se pueden poner las manos que aseguren que realmente funciona como se espera. Eso incluye no abusar de la memoria, por lo que usar valgrind es una buena idea.

Realmente desea que sus pruebas de unidad demuestren que su código funciona.

No tiene que ejecutarlos en valgrind todo el tiempo, pero debe ser tan trivial como sea posible para hacerlo, y debe hacerlo periódicamente (por ejemplo, después de grandes cambios).

Cuestiones relacionadas