¿Qué son las pruebas de Google, las pruebas de muerte?

4 minutos de lectura

avatar de usuario
noche

Vi que la documentación de esa función parece bastante importante, ya que se encuentra en las funciones de descripción general de Google Test y se detalla en:
https://github.com/google/googletest/blob/master/docs/advanced.md#death-tests

Se ven como estándar assert() pero son parte de Google Test, por lo que es un marco de prueba xUnit. Por lo tanto, me pregunto cuál es el uso real o ventaja de usar esos pruebas de muerte son.

La afirmación está ahí para confirmar que una función provocaría la finalización del programa si se ejecutara en el proceso actual (los detalles explican que la prueba de muerte se invoca desde un subproceso que permite que las pruebas continúen a pesar de la muerte). Esto es útil porque algún código puede garantizar la finalización/aborto del programa en caso de falla (por ejemplo, si hubo un error irrecuperable), y las pruebas unitarias deben confirmar que una función se adhiere a su comportamiento documentado, independientemente de cuál sea.

La descripción en la página wiki realmente lo explica mejor:

En muchas aplicaciones, hay aserciones que pueden causar fallas en la aplicación si no se cumple una condición. Estas comprobaciones de cordura, que aseguran que el programa está en un buen estado conocido, están ahí para fallar lo antes posible después de que se corrompa algún estado del programa. Si la aserción verifica la condición incorrecta, entonces el programa puede continuar en un estado erróneo, lo que podría provocar daños en la memoria, agujeros de seguridad o algo peor. Por lo tanto, es de vital importancia probar que tales afirmaciones funcionan como se espera.

  • La parte que me preocupa es la ganancia de usar Google Death Tests sobre ASSERT() o assert().

    – la noche

    13 de septiembre de 2010 a las 9:44

  • @Wernight: si usas assert y falla, entonces el proceso se detiene, y por lo tanto la prueba unitaria se detiene, no se genera ningún informe, etc. Al lanzar la prueba en otro proceso, es posible monitorear que se detuvo como se esperaba, informar si no, etc. .

    – Matthieu M.

    13 de septiembre de 2010 a las 11:25

  • @Matthieu: Entonces, reemplazando en la aplicación tradicional assert() por Google Test ASSERT_EXIT() la versión funcionará igual, pero durante la ejecución de la prueba, las afirmaciones se pueden verificar correctamente.

    – la noche

    15 de septiembre de 2010 a las 14:13

  • @Wernight: no, ASSERT_EXIT es una especie de prueba de Google. Lo usas en tu código de prueba. Significa, “probar que el código especificado existe”, al igual que ASSERT_THROW significa, “prueba que arroja el código especificado”. Deje el código bajo prueba solo.

    –Steve Jessop

    21 de septiembre de 2010 a las 0:17

  • @Steve: D’OH! Comprendido. Las pruebas de muerte son afirmaciones de prueba para poner en el código de prueba unitaria, al igual que ASSERT_EQ, que verifican que el programa existe o falla de cierta manera dadas algunas entradas. Así que en el código del programa todavía usamos assert() u otros métodos tradicionales para cerrar/bloquear la aplicación.

    – la noche

    21 de septiembre de 2010 a las 7:55


avatar de usuario
Jon Cage

Pensé que la introducción en su enlace lo explicaba bastante bien:

En muchas aplicaciones, hay aserciones que pueden causar fallas en la aplicación si no se cumple una condición. Estas comprobaciones de cordura, que aseguran que el programa está en un buen estado conocido, están ahí para fallar lo antes posible después de que se corrompa algún estado del programa. Si la aserción verifica la condición incorrecta, entonces el programa puede continuar en un estado erróneo, lo que podría provocar daños en la memoria, agujeros de seguridad o algo peor. Por lo tanto, es de vital importancia probar que tales afirmaciones funcionan como se espera.

Dado que estas comprobaciones de condiciones previas hacen que los procesos mueran, las llamamos pruebas de muerte. En términos más generales, cualquier prueba que verifique que un programa finalice de la manera esperada también es una prueba de muerte.

¿Qué parte de eso no tiene sentido?

  • Probablemente me perdí esa parte. pues lo tradicional ASSERT() es una prueba de muerte.

    – la noche

    13 de septiembre de 2010 a las 9:43

  • @Wernight: no, ASSERT_DEATH es una prueba de muerte. Un tradicional assert es el comportamiento del programa para el que le gustaría escribir una prueba de muerte, para probar que el proceso en el que el assert ocurre muere como se esperaba.

    –Steve Jessop

    13 de septiembre de 2010 a las 9:49


  • @Wernight ¿la prueba de muerte también prueba que ocurre una falla de segmento?

    – Daniel

    29 de octubre de 2019 a las 7:47

¿Ha sido útil esta solución?