c++ - setup - google test speed
SetUp vs Constructor en Test Fixture (1)
Hay una respuesta a eso en el FAQ :
¿Debo usar el constructor / destructor del dispositivo de prueba o la función de configuración / desmontaje?
Lo primero que hay que recordar es que Googletest no reutiliza el mismo objeto de prueba de prueba en varias pruebas. Para cada
TEST_F
, googletest creará un nuevo objeto de prueba de prueba, llamará inmediatamente aSetUp()
, ejecutará el cuerpo de prueba, llamará aTearDown()
y luego eliminará el objeto de prueba de prueba.Cuando necesita escribir la lógica de configuración y desmontaje por prueba, tiene la opción de utilizar el constructor / destructor del dispositivo de prueba o
SetUp()/TearDown()
. Generalmente se prefiere el primero, ya que tiene los siguientes beneficios:
- Al inicializar una variable miembro en el constructor, tenemos la opción de hacerlo
const
, lo que ayuda a evitar cambios accidentales en su valor y hace que las pruebas sean más correctas.- En el caso de que necesitemos subclasificar la clase de dispositivo de prueba, se garantiza que el constructor de la subclase llame primero al constructor de la clase base, y se garantiza que el destructor de la subclase llame al destructor de la clase base después . Con
SetUp()/TearDown()
, una subclase puede cometer el error de olvidar llamar aSetUp()/TearDown()
la clase base o llamarlos en el momento equivocado.Es posible que aún quieras usar
SetUp()/TearDown()
en los siguientes casos raros:
- En el cuerpo de un constructor (o destructor), no es posible usar las macros
ASSERT_xx
. Por lo tanto, si la operación de configuración podría causar un error fatal en la prueba que debería evitar que la prueba se ejecute, es necesario usar una macroCHECK
o usarSetUp()
lugar de un constructor.- Si la operación de desmontaje puede
TearDown()
una excepción, debes usarTearDown()
en lugar del destructor, ya que lanzar un destructor conduce a un comportamiento indefinido y generalmente matará tu programa de inmediato. Tenga en cuenta que muchas bibliotecas estándar (como STL) pueden lanzarse cuando las excepciones están habilitadas en el compilador. Por lo tanto, debería preferirTearDown()
si desea escribir pruebas portátiles que funcionen con o sin excepciones.- El equipo más inteligente está considerando hacer que las macros de afirmación se lancen en plataformas donde las excepciones están habilitadas (por ejemplo, Windows, Mac OS y Linux del lado del cliente), lo que eliminará la necesidad de que el usuario propague fallas de una subrutina a su llamador. Por lo tanto, no debe usar aseveraciones de Google en un destructor si su código podría ejecutarse en dicha plataforma.
- En un constructor o destructor, no puede realizar una llamada de función virtual en este objeto. (Puede llamar a un método declarado como virtual, pero estará enlazado estáticamente). Por lo tanto, si necesita llamar a un método que se anulará en una clase derivada, debe usar
SetUp()/TearDown()
.
¿Por qué un dispositivo de prueba tiene un método de configuración en Google Test? ¿No es el Constructor efectivamente lo mismo? Igualmente para el método TearDown. Las llamadas a SetUp y al Constructor, así como a TearDown y al Destructor, son consistentes con los TestEventListeners: OnTestStart y OnTestEnd.