2012-04-20 27 views
13

Estoy buscando una buena forma de probar mis métodos, clases y funciones con plantillas en C++. Tengo la sensación de que no es suficiente con solo probar con un solo tipo, y no me parece correcto duplicar las pruebas unitarias y reemplazar los tipos.¿Cuál es una buena manera de probar la unidad de métodos/clases/funciones de C++?

Para ser más específicos, estoy trabajando en una clase Matrix y utilizando el marco de prueba de unidades de Boost. The Matrix es para trabajar con diferentes tipos. Principalmente se usará para tipos básicos, pero me gustaría que también sea compatible con tipos concretos.

Nota: Hago esto con fines de aprendizaje, por lo que no estoy usando una implementación de matriz existente.

+4

"no se siente bien duplicar las pruebas unitarias y reemplazar los tipos". ¿por qué? si quiere probar que también funciona con otros tipos, no puede hacerlo sin probarlo con otros tipos. – PlasmaHH

Respuesta

12

Boost test tiene una macro BOOST_AUTO_TEST_CASE_TEMPLATE que ejecuta una prueba en una plantilla para cada tipo en un boost :: mpl :: list.

template<typename T> 
T Add(T lh, T rh) 
{ 
    return lh + rh; 
} 

typedef boost::mpl::list<int, float> test_types; 

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types) 
{ 
    T result = Add(T(1), T(2)); 
    BOOST_CHECK_EQUAL(T(3), result); 
} 

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

0

El objetivo de la prueba unitaria es cubrir cada rama de su código. Si las pruebas con diferentes tipos cubren diferentes ramas, entonces tiene sentido agregar pruebas de unidad específicas de tipo, de lo contrario, es solo copiar y pegar.

0

Si está probando una plantilla por unidad, entonces necesita probar la clase de plantilla con todos los tipos posibles, o hasta que crea que es suficiente. No hay forma de evitarlo

Su clase podría funcionar con int, pero no para flotar.

Si la plantilla no se debe usar con ciertos tipos, entonces debe agregar algunos static_assert en su código.

3

Estoy de acuerdo con josuegomes y VJovic. Creo que una forma de minimizar la duplicación de código es hacer una función de plantilla con la lógica de prueba de su unidad y luego llamarla con los diferentes argumentos de tipo. De esta forma, puede colocar toda su lógica de prueba de la unidad Matrix en un solo lugar, mientras llama a la función de prueba de la unidad plantilla una vez por cada tipo deseado.

Sin embargo, podría ser excesivo hacerlo. Creo que depende de la cantidad de lógica en tus pruebas.

Cuestiones relacionadas