Este artículo cierra una serie de dos entregas sobre un marco minimalista de pruebas unitarias en C++ distribuido en un único archivo de cabecera. Tras presentar el mecanismo básico basado en macros (test_, fail_, throw_ y nothrow_) en la primera parte, el autor aborda dos problemas pendientes: la violación de la regla de una definición (ODR) por las variables de conteo nPass y nFail compartidas entre unidades de traducción, y la necesidad de modernizar el diseño aprovechando las novedades del estándar.
La primera solución recurre a las variables inline introducidas en C++17, que permiten definir las mismas variables en múltiples unidades de traducción y hacen que el enlazador las consolide en una única instancia. Al declararlas dentro del espacio de nombres TestFramework se evita también la contaminación del espacio global, manteniendo la cabecera como único archivo del marco. Esta variante es portable a cualquier compilador con soporte C++17 y no obliga a reorganizar el proyecto.
La segunda solución migra las variables y funciones a un módulo C++20 llamado test (test.cppm), dejando las macros en una cabecera aparte (test_macros.h) porque el preprocesador no puede exportar macros desde un módulo. Para capturar el archivo y la línea en el punto de llamada se sustituyen FILE y LINE por std::source_location, aprovechando además std::string_view para recibir el texto de la expresión. El cliente debe escribir import test antes de #include "test_macros.h" para que el espacio de nombres sea visible.
El autor recomienda la versión solo-cabecera para entornos docentes o proyectos que necesiten compilar en cualquier herramienta, por su simplicidad y portabilidad. La versión basada en módulos ofrece encapsulación real y evita reanalizar la cabecera en cada unidad de traducción, pero requiere un soporte de módulos maduro y un orden estricto de importación. El enfoque híbrido (módulo más macros en cabecera) convivirá probablemente durante años con la transición del ecosistema compilador. El código se desarrolla en Visual C++ con Visual Studio 2026 Community Edition.
