2011-03-10 17 views
7

Estoy usando Google Test para probar mi proyecto C++. Algunos casos, sin embargo, requieren acceso a argc y argv para cargar los datos requeridos.¿Cuál es la forma de acceder a argc y argv dentro de un caso de prueba en Google Test Framework?

En el método main(), al inicializar, argc y argv pasan al constructor de prueba.

testing::InitGoogleTest(&argc, argv); 

¿Cómo puedo acceder a ellos más adelante en una prueba?

TEST(SomeClass, myTest) 
{ 
    // Here I would need to have access to argc and argv 
} 
+0

posible duplicado de [Cómo pasar parámetros al gtest] (http://stackoverflow.com/questions/4818785/how-to-pass-parameters-to-the-gtest) –

+1

No se responde sin embargo y la respuesta se publica a continuación, así que por favor no cierres. – Nils

+0

¿Qué quiere decir con "no se responde"? La respuesta está ahí: "Use su técnica favorita de análisis de línea de comandos, almacene los resultados en alguna variable global y consúltelo durante sus pruebas". Además, eso no tiene nada que ver con si esto debería cerrarse. Es una pregunta duplicada. Una vez que se cierra, las respuestas se pueden fusionar. –

Respuesta

7

No sé marco de pruebas de Google, por lo que no podría haber una mejor manera de hacer esto, pero esto debería hacer:

//--------------------------------------------- 
// some_header.h 
extern int my_argc; 
extern char** my_argv; 
// eof 
//--------------------------------------------- 

//--------------------------------------------- 
// main.cpp 
int my_argc; 
char** my_argv; 

int main(int argc, char** argv) 
{  
    ::testing::InitGoogleTest(&argc, argv); 
    my_argc = argc; 
    my_argv = argv; 
    return RUN_ALL_TESTS(); 
} 
// eof 
//--------------------------------------------- 

//--------------------------------------------- 
// test.cpp 
#include "some_header.h" 

TEST(SomeClass, myTest) 
{ 
    // Here you can access my_argc and my_argv 
} 
// eof 
//--------------------------------------------- 

Globals no son agradables, pero cuando todo lo que tienes es una prueba marco que no le permitirá tunelizar algunos datos del main() a las funciones de prueba que tenga, ellos hacen el trabajo.

+0

¿Puedo solicitar que cambie main() a '{:: testing :: InitGoogleTest (& argc, argv); my_argc = argc; my_argv = argv; devuelve RUN_ALL_TESTS(); } '? Si ha superado los argumentos de gtest, entonces google test los eliminará de argv y disminuirá argc. Esto sucede en InitGoogleTest. Si asigna antes, su argumento puede sobreescribir el número de cadenas no nulas en argv. – totowtwo

+0

@totowtow: No sé nada sobre la prueba de Google.¿Por qué no agregas esa respuesta por ti mismo? Sígueme aquí y tendrás mi voto positivo. – sbi

+0

Bueno, el tuyo ya es la respuesta aceptada en una vieja pregunta, así que acabo de enviar una edición – totowtwo

1

Los argumentos de línea de comandos para el ejecutable de prueba son para el marco prueba, no para sus pruebas. Con ellos, configura cosas como --gtest_output, --gtest_repeat o --gtest_filter. Una prueba debe ser, ante todo, reproducible, que no lo es si depende de que alguien utilice los parámetros "correctos".

¿Qué intentas lograr de todos modos?

+0

simplemente haciendo que argc y argv estén disponibles para el alcance con TEST (..) {} – Nils

+0

@Nils: Lo que estaba tratando de señalar es que usar opciones de línea de comando dentro de un controlador de prueba es una idea ** tonta **, básicamente derrotando el propósito de un controlador de prueba. – DevSolar

+3

@DevSolar es una opinión horrible, carente de imaginación. ¿De qué otra forma especifica una dirección IP para que se ejecuten las pruebas de red? argv beats hardcoding o archivos de configuración personalizados. – totowtwo

1

Si se ejecuta en Windows utilizando Visual Studio, están disponibles en __argc y __argv.

+2

Desafortunadamente estoy en Linux ... – Nils

+1

De hecho desafortunado :) –

Cuestiones relacionadas