¿Cuál es la mejor manera de organizar las pruebas en un proyecto en C?

directorio / pruebas funciona bien con pruebas con nombres apropiados. En su caso, sería src / tests con archivos como src / tests / test_module2.c. Con sistemas menos triviales que involucran múltiples directorios de origen, tendría cosas como src / lib1 / tests y src / program1 / tests. Los programas de prueba individuales pueden estar en diferentes niveles de abstracción o cubrir diferentes funcionalidades (configuración, operación normal, prueba de esfuerzo usando hilos) en lugar de tener una relación 1: 1 con los archivos fuente.

Desea que el código de prueba esté en un subdirectorio del código de producto correspondiente porque eso funciona bien con las prácticas de desarrollo normales: cuando confirma el directorio actual en el software de control de revisión, tanto las pruebas como la fuente se registran. Compilación en el directorio fuente puede construir pruebas recursivamente. “make test” en el directorio fuente puede construirlo (si es necesario) y luego descender para ejecutar las pruebas. Las ramas del subárbol de la fuente y la prueba son más fáciles.

Es más probable que falten cosas cuando los directorios fuente y de prueba son hermanos, y eso no se escala a medida que los sistemas se vuelven demasiado grandes para que un solo directorio fuente sea práctico.

Use la configuración del compilador para controlar de dónde provienen las inclusiones en lugar de incluirlas a través de rutas relativas (-I bajo unix). Esto se ve más limpio y es más tolerante con la refactorización que mueve las cosas.

Cunit funciona bien.

Gracias por el A2A. Sin embargo, puede que no sea el más calificado para responder aquí …

Como señala, no importa dónde coloque su directorio de prueba (si está dentro de src / o aparte de él), en algún momento tendrá que incluir algunos encabezados de src /. Hasta donde sé, la mejor solución para eso es elegir una convención y cumplirla para que todas sus pruebas tengan el mismo patrón de inclusión. Puede haber una manera de calcular la ruta de inclusión correcta desde su sistema de compilación (por ejemplo, make).
Lo principal a tener en cuenta es que agregar una nueva prueba debe tener un costo 0 a través de la convención que elija, casi podría automatizarse (excepto el código de la prueba).

La ejecución de pruebas automáticamente después de modificar las fuentes se puede lograr fácilmente mediante make a través de una simple regla Makefile. Otras herramientas de construcción también deberían tener este tipo de instalación.

No sé mucho sobre las mejores prácticas de las convenciones de prueba, o los marcos de pruebas unitarias para C … esto quizás sea lo que podrías buscar para obtener más información.