2008-12-23 21 views
13

He utilizado plantillas de funciones y clases en la implementación de mis bibliotecas. Hasta ahora, he creado una instancia de una plantilla en la biblioteca unit-tests (CppUnit), y luego procedí a probarla casi como cualquier otra clase o función normal.Pruebas unitarias de plantillas C++

Recientemente he estado planeando agregar algunas plantillas también a las API de la biblioteca. Una buena interfaz es, por supuesto, lo más importante, plantilla o no. Con plantillas bien diseñadas e implementadas puede, si no evitar totalmente, al menos dificultar que el usuario se pegue un tiro en el pie. De cualquier forma creo que las plantillas públicas de pruebas unitarias deben ser un poco más rigurosas, en comparación con las plantillas puramente internas.

Entonces, ¿cómo ha probado sus plantillas de C++? ¿Ha encontrado alguna solución elegante, especialmente para plantillas en API de bibliotecas públicas?

Respuesta

5

Para empezar, pruebe su código de plantilla con el parámetro que cree que es más probable que el usuario suministre. A menudo hice las plantillas de cosas "por si acaso" y acabo nunca usando nada más que el único tipo que tenía en mente cuando escribí el código original. Entonces, en ese caso, ¡probar el caso más probable cubre todos los casos!

Si siente que necesita probar más, use otro argumento de plantilla lo más diferente posible del primer argumento. Puede que no sea necesario volver a probar todos los métodos. Algunos métodos pueden no depender del parámetro de la plantilla.

0

La implantación de la plantilla en la prueba unitaria es para probar una clase de plantilla.

¿Cuáles son los riesgos? Dependen de lo que su biblioteca está haciendo con el parámetro de la plantilla; piense en qué problemas podrían surgir dependiendo de la clase utilizada para instanciar su clase de plantilla y escribir nuevas pruebas.

Por lo menos tendrá su entorno de pruebas unitarias listo para reproducir cualquier problema que se informará.

4

Tengo sugerencia adicional. Además de probar cada plantilla por unidad, examine las técnicas que ayudarán a restringir el universo potencialmente vasto de argumentos de plantilla que los usuarios de su biblioteca podrían intentar pasar a sus plantillas.

Por ejemplo: supongamos que solo prueba las plantillas con los argumentos de tipo "cadena" y "char". No tiene pruebas de que otros argumentos de tipo sean problemáticos para esta plantilla en particular, pero por una razón u otra usted "sospecha" que otros argumentos no probados serán problemáticos.

En un caso como el ejemplo anterior, no implica necesariamente que deba probar exhaustivamente otros tipos de argumentos. En su lugar, tiene un caso que podría implicar que debe emplear algunas técnicas de metaprogramación de plantillas en tiempo de compilación para asegurarse de que su plantilla nunca se use con otros argumentos, excepto "cadena" y "char".

Un recurso:

Modern C++ Design -- by Andrei Alexandrescu

muy temprano en este libro, el autor muestra ejemplos tales como:

  • cómo hacer una plantilla que se auto-valer que su primer tipo arg ser de un tipo más pequeño que su segundo tipo arg

  • cómo detectar la convertibilidad y la herencia en tiempo de compilación

"Modern C++ Design" (a pesar de su título bastante amplio/vaga) es una exploración bastante avanzado de las técnicas de programación plantilla.

+0

Restringir los argumentos del tipo de plantilla es importante, +1 por mencionarlo. No hacerlo es como tener todos los parámetros de las funciones tipo void * – Iocio

3

Boost.Test tiene un componente que facilita la prueba de plantillas contra un conjunto de parámetros de plantilla.