La próxima semana hablaré con mi departamento sobre las pruebas unitarias y el desarrollo basado en pruebas. Como parte de esto, voy a mostrar algunos ejemplos del mundo real de un código que he escrito recientemente, pero también me gustaría mostrar algunos ejemplos muy simples que escribiré en la charla.
He estado buscando en la web buenos ejemplos, pero he estado luchando por encontrar alguno que sea particularmente aplicable a nuestra área de desarrollo. Casi todo el software que escribimos son sistemas de control profundamente integrados que se ejecutan en pequeños microcontroladores. Hay una gran cantidad de código C que es fácilmente aplicable a las pruebas unitarias (hablaré sobre las pruebas unitarias en la PC en lugar de en el objetivo en sí) siempre y cuando se mantenga alejado de la capa 'inferior': lo que habla directamente a los periféricos del microcontrolador. Sin embargo, la mayoría de los ejemplos que he encontrado tienden a basarse en el procesamiento de cadenas (por ejemplo, el excelente ejemplo de los números romanos de inmersión en Python) y dado que casi nunca usamos cadenas, esto no es realmente adecuado (sobre las únicas funciones de biblioteca que nuestro código generalmente usa son memcpy
, memcmp
y memset
,strcat
o expresiones regulares no es del todo correcto).
Entonces, a la pregunta: ¿alguien puede ofrecer algunos buenos ejemplos de funciones que pueda usar para demostrar las pruebas unitarias en una sesión en vivo? Una buena respuesta en mi opinión (sujeta a cambios) probablemente sería:
- Una función que es lo suficientemente simple que cualquiera (incluso aquellos que solo escriben código ocasionalmente) puede entender;
- Una función que no parece inútil (es decir, calcular la paridad o CRC es probablemente mejor que una función que multiplica dos números y agrega una constante aleatoria);
- Una función que es lo suficientemente corta como para escribir frente a una sala de personas (puedo aprovechar los muchos portapapeles de Vim para reducir errores ...);
- Una función que toma números, matrices, punteros o estructuras como parámetros y devuelve algo similar, en lugar de manejar cadenas;
- Una función que tiene un error simple (p. Ej., En
>
lugar de>=
) que es fácil de implementar y que aún funcionaría en la mayoría de los casos, pero que se rompería con algún caso particular: fácil de identificar y corregir con una prueba unitaria.
¿Alguna idea?
Aunque probablemente no sea relevante, las pruebas en sí mismas probablemente se escribirán en C ++ usando el Marco de prueba de Google: todos nuestros encabezados ya tienen el #ifdef __cplusplus extern "C" {
envoltorio alrededor de ellos; Esto ha funcionado bien con las pruebas que he hecho hasta ahora.