txt texto registro modificar manejo leer guardar generar dev datos crear con como archivos archivo c++ unit-testing mocking googlemock

texto - guardar y leer datos en un archivo.txt en c++



¿Se burlan de métodos no virtuales en C++ sin editar el código de producción? (3)

Escribiría un script Perl / Ruby / Python para leer en el árbol de origen original y escribiría un árbol de origen simulado en un directorio diferente. No es necesario analizar C ++ completamente para reemplazar una definición de función.

Soy un desarrollador de software bastante nuevo que actualmente trabaja agregando pruebas unitarias a un proyecto de C ++ existente que comenzó hace años. Debido a una razón no técnica, no puedo modificar ningún código existente. La clase base de todos mis módulos tiene un montón de métodos para establecer / obtener datos y comunicarse con otros módulos.

Ya que solo quiero realizar pruebas unitarias de cada módulo individual, quiero poder usar valores fijos para todos mis métodos de comunicación entre módulos. Es decir, para un método Ping () que verifica si otro módulo está activo, quiero que devuelva verdadero o falso según el tipo de prueba que estoy haciendo. He estado buscando en Google Test y Google Mock, y es compatible con los métodos no virtuales de burla. Sin embargo, el enfoque descrito ( http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods ) me obliga a "templar" los métodos originales para tomar objetos reales o simulados. No puedo ir a templar mis métodos en la clase base debido al requisito mencionado anteriormente, así que necesito alguna otra forma de burlarme de estos métodos virtuales.

Básicamente, los métodos que quiero simular están en alguna clase base, los módulos que quiero probar por unidad y crear simulaciones son clases derivadas de esa clase base. Hay módulos intermedios entre mi clase de Módulo base y los módulos que quiero probar.

¡Apreciaría cualquier consejo!

Gracias,

JW

EDITAR: A ejemplos más concretos.

Mi clase base es, digamos, rootModule, el módulo que quiero probar es leafModule. Hay un módulo intermedio que hereda de rootModule, leafModule hereda de este módulo intermedio.

En mi leafModule, quiero probar el método doStuff (), que llama al GetStatus no virtual (nombre de módulo) definido en la clase rootModule. Necesito hacer de alguna manera GetStatus () para devolver un valor fijo elegido. La burla es nueva para mí, ¿por lo tanto, usar objetos simulados es el enfoque correcto?


Hay algunas formas diferentes de reemplazar funciones no virtuales. Una es volver a declararlos y compilar un nuevo ejecutable de prueba para cada conjunto diferente de funciones no virtuales que le gustaría probar. Eso es difícilmente escalable.

Una segunda opción es hacerlos virtuales para prueba. La mayoría de los compiladores le permiten definir algo en la línea de comandos, así que compile su código con -DTEST_VIRTUAL = virtual o -DTEST_VIRTUAL para que sean virtuales o normales, dependiendo de si está en prueba o no.

Una tercera opción que se puede usar es utilizar un marco de simulacro que le permita simular funciones no virtuales. Soy el autor de HippoMocks (descargo de responsabilidad con respecto a la neutralidad, etc.) y recientemente hemos agregado la capacidad de simular las funciones de C simple en las plataformas X86. Esto se puede extender a las funciones miembro no virtuales con un poco de trabajo y sería lo que está buscando. Tenga en cuenta que, si su compilador puede ver tanto el uso como la definición de una función al mismo tiempo, puede que esté en línea y que la burla pueda fallar. Esto se aplica en particular a las funciones que se definen en los encabezados.

Si la función normal de C es suficiente para usted, puede usarla como está ahora.


Un enfoque sería especificar diferentes fuentes para la prueba. Digamos que su destino de producción utiliza rootModule.h y rootModule.cpp. Utilice diferentes fuentes para su objetivo de prueba. Puede especificar un encabezado diferente cambiando su ruta de inclusión, de modo que #include "rootModule.h" en realidad cargue unittest / rootModule.h. Luego simulase rootModule al contenido de tu corazón.