2011-02-03 10 views
6

Supongamos que estoy escribiendo un biblioteca plantilla consiste en una plantilla de función¿Cómo escribir prueba para plantillas C++?

template<T> void f(T); 

con el requisito de que funciona con un conjunto predefinido de clases A, B, C, y D, por ejemplo, el siguiente debe compilar :

template<> void f(A); 
template<> void f(B); 
template<> void f(C); 
template<> void f(D); 

Qué marco de prueba que puede utilizar para escribir casos de prueba que captura este requisito en tiempo de ejecución en lugar de fallar en la compilación del código de prueba? En otras palabras, me gustaría que el framework instanciara las plantillas en runtime y produzca un informe de errores muy formateado si falla un subconjunto de ellos.

Sé que puedo renunciar a los marcos de prueba por completo y simplemente escribir un archivo de cc simple que contiene las 4 líneas de arriba. Pero esperaba poder incorporar este requisito en casos de prueba estándar y regulares para la generación de informes de estado de prueba. Por ejemplo,

test f works with A: passed. 
test f works with B: passed. 
test f works with C: failed! Cannot cast type C! 
test f works with D: passed. 

3 of 4 tests passed. 
1 of 4 tests failed. 

Respuesta

5

Escriba un caso de prueba que genere el compilador ... así es como p. autoconf prueba de la existencia de características.

+0

+1: así es como se prueban también los compiladores: p Es posible que desee echar un vistazo al marco 'iluminado' en LLVM/Clang que permite especificar los errores esperados en los comentarios alineados al lado de la prueba. –

1

Basado en lo que estás tratando de probar aquí, comprobando si la cosa puede compilar es la única prueba sensata que puede realizar.

Las pruebas no deben realizarse por el mero hecho de probar, sino para garantizar la corrección funcional. Si desea realizar pruebas adecuadas en su clase, debe escribir pruebas que verifiquen la funcionalidad de su plantilla con las 4 clases diferentes con las que se puede compilar.

2

No entiendo por qué fallar en tiempo de ejecución es preferible a fallar en tiempo de compilación. Cuanto antes falle en el proceso de prueba unitaria, mejor. Es preferible que las pruebas de su unidad no se compilen sino que fallen. Es aún más fácil de arreglar, de hecho, probablemente ni siquiera se comprometerá con el control de la fuente. Su prueba unitaria solo debe incluir esas cuatro líneas y afirmar verdadero al final. Tenga en cuenta que esta no es la forma en que iría por hacerlo yo mismo.

+0

Porque nos gustaría capturar todas las especificaciones funcionales para capturarlas como pruebas unitarias que se informarán como progreso del proyecto. Si el programa de prueba ni siquiera compila, entonces no se informa ninguna de las pruebas, ni siquiera las que pasaron. – kirakun

+0

Quizás deba dividir su programa de prueba en varios programas, uno por prueba. Eso evitaría el problema que describes arriba. –

2

Las plantillas C++ son una función de tiempo de compilación. En muchos casos fallarán en tiempo de compilación, por diseño. Simplemente no puedes evitar esto without doing something really crazy.

Sin embargo, también querrá saber que las especializaciones de su plantilla son correctas, porque las especializaciones anulan el comportamiento que de otra manera obtendría de la plantilla. Así que prueba las especializaciones. Pero date cuenta de que nunca pasarás por alto los aspectos del tiempo de compilación de las plantillas.