Cómo ejecutar casos de prueba específicos en GoogleTest

125

Estoy tratando de escribir una función / método para mi proyecto, que le preguntará al usuario cuáles son todos los casos de prueba que va a ejecutar. Se ve a continuación ...,

Test_Cases_1
         |_TestNo1
         |_TestNo2....so on
Test_Cases_2
         |_TestNo1
         |_TestNo2....so on
....
....so on
Test_Cases_N
         |_TestNo1
         |_TestNo2....so on

Entonces, ahora el desafío es que mientras se ejecuta el proyecto, debería indicarme cuáles son todos los casos de prueba que le gustaría ejecutar. Si selecciono Test_Cases_1y Test_Cases_N. Entonces debería ejecutar estos dos casos de prueba y debería excluir todos los demás de Test_Cases_2 to ..... En la ventana de resultados también me gustaría ver los resultados de Test_Cases_1y Test_Cases_N.

Entonces, si veo GoogleTest, hay un método llamado test_case_to_run_count(); Pero todos se test casesestán registrando con el método Test_F (). Entonces, hice muchos análisis, pero aún no encontré ninguna solución. Por favor, ayúdame.

Rasmi Ranjan Nayak
fuente

Respuestas:

181

Puede utilizar opciones avanzadas para ejecutar pruebas de Google.

Para ejecutar solo algunas pruebas unitarias, puede usar la --gtest_filter=Test_Cases1*opción de línea de comando con un valor que acepta los comodines *y ?para hacer coincidir con múltiples pruebas. Creo que solucionará tu problema.

UPD:

Bueno, la pregunta era cómo ejecutar casos de prueba específicos. La integración de gtest con su GUI es otra cosa, que realmente no puedo comentar, porque no proporcionó detalles de su enfoque. Sin embargo, creo que el siguiente enfoque podría ser un buen comienzo:

  1. Obtenga todos los casos de prueba ejecutando pruebas con --gtest_list_tests
  2. Analice estos datos en su GUI
  3. Seleccione los casos de prueba que desee ejecutar
  4. Ejecutar prueba ejecutable con opción --gtest_filter
Nogard
fuente
Recomendaría esto, y si necesita un sistema basado en avisos, sugeriría crear un script de envoltura que obtenga la entrada del usuario y ejecute el programa de prueba en consecuencia.
boycy
@nogard: Sí, tiene razón, pero mi / nuestro objetivo es tener una interfaz gráfica de usuario, que tendrá las características Treede TestCasesy TestNo. Entonces, ¿crees que --gtest_filter=..te ayudará?
Rasmi Ranjan Nayak
@nogard: Muchas gracias por la ayuda ... Seguiré adelante como me ha indicado ... Se lo haré saber una vez que haya terminado.
Rasmi Ranjan Nayak
1
@nogard: Estoy haciendo lo mismo que me ha indicado; int main(int argc, char **argv) { //::testing::GTEST_FLAG(list_tests) = true; // For Testing InitGoogleTest(&argc, argv); ::testing::GTEST_FLAG(list_tests) = true; ........ RUN_ALL_TEST();...}Pero imprime solo el Testcase y TestNo. y pero no ejecuta las pruebas. Entonces, ¿cómo puedo ejecutar las pruebas ahora?
Rasmi Ranjan Nayak
@RasmiRanjanNayak: Propuse no cambiar la principal en absoluto. Propongo ejecutar las pruebas dos veces: la primera vez que se ejecute con --gtest_list_tests, luego la segunda ejecución para las pruebas seleccionadas con la opción --gtest_filter
nogard
91

Resumiendo las respuestas de @Rasmi Ranjan Nayak y @nogard y agregando otra opción:

En la consola

Deberías usar la bandera --gtest_filter, como

--gtest_filter=Test_Cases1*

(También puede hacer esto en Propiedades | Propiedades de configuración | Depuración | Argumentos de comando)

En el medio ambiente

Deberías establecer la variable GTEST_FILTER como

export GTEST_FILTER = "Test_Cases1*"

En el código

Deberías poner una bandera filter , como

::testing::GTEST_FLAG(filter) = "Test_Cases1*";

de modo que su función principal se convierta en algo así como

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    ::testing::GTEST_FLAG(filter) = "Test_Cases1*";
    return RUN_ALL_TESTS();
}

Consulte la sección Ejecución de un subconjunto de las pruebas para obtener más información sobre la sintaxis de la cadena que puede utilizar.

Jorge Leitão
fuente
6
muy útil la parte "En el código" !! ¡¡Esto es lo que estaba buscando!!
Iero
28

Finalmente obtuve una respuesta, ::test::GTEST_FLAG(list_tests) = true;// De su programa, no de la consola.

Si desea usar --gtest_filter =*; /* =*, =xyz*... etc*/// Necesita usarlos en Console.

Entonces, mi requisito es usarlos desde el programa, no desde la consola.

Updated:-

Finalmente obtuve la respuesta para actualizar el mismo desde el programa.

 ::testing::GTEST_FLAG(filter) = "*Counter*:*IsPrime*:*ListenersTest.DoesNotLeak*";//":-:*Counter*";
      InitGoogleTest(&argc, argv);
RUN_ALL_TEST();

Entonces, gracias por todas las respuestas.

Ustedes son geniales.

Rasmi Ranjan Nayak
fuente