Pruebas en la pista de Fortran

Aprende a probar tus ejercicios de Fortran en Exercism


Cada ejercicio incluye las pruebas unitarias y una receta de compilación de CMake. La implementación la aportas tú. Cada archivo de pruebas está pensado para enlazarse con tu implementación y producir así un ejecutable de consola que ejecuta las pruebas. Al ejecutar el ejecutable de pruebas, se imprimen mensajes por cada prueba que falla y se informa un estado de salida distinto de cero cuando las pruebas fallan.

El archivo de pruebas tendrá el nombre <exercise>_test.f90, así que para el ejercicio «Bob» el archivo que contiene las pruebas es bob_test.f90. Cada prueba tendrá un comentario que describe la prueba y después la prueba en sí, que empieza con call assert_equal, por ejemplo.

  ! Test 16: non-letters with question
  call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Para desactivar una prueba, basta con comentarla con un '!', por ejemplo.

  ! Test 16: non-letters with question
  ! call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Avanzar por cada ejercicio es un proceso que consiste en:

  • Crear la compilación inicial con CMake
  • Para cada prueba unitaria:
    • Resolver los errores de compilación para que la prueba falle.
    • Implementar lo justo y necesario para que la prueba pase.
    • Refactorizar tu implementación para mejorar la legibilidad, reducir la duplicación, etc.
    • Descomentar la siguiente prueba

Crear la compilación inicial con CMake

Cada ejercicio trae un archivo CMakeLists.txt junto con las pruebas unitarias. Contiene la receta predefinida de CMake que se encarga de la compilación por ti. No deberías necesitar editar este archivo. La receta incluida da por sentado que tu implementación existe en un archivo fuente con el nombre del ejercicio.

Por ejemplo, el ejercicio «Bob» espera una implementación en el archivo bob.f90.

Crea tus archivos de implementación iniciales antes de ejecutar CMake. Si no tienes el archivo bob.f90 cuando ejecutas CMake para el ejercicio «Bob», CMake generará un error porque no encuentra los archivos. Estos archivos pueden estar vacíos, pero deben existir.

Con esta receta, CMake puede generar un proyecto adecuado para tu entorno si ejecutas cmake -G con un generador adecuado y la ubicación del directorio del ejercicio. CMake generará un script de compilación apropiado para tu sistema operativo. Para mantener esos archivos generados separados del código fuente del ejercicio, es común crear un directorio llamado build que contenga tanto esos archivos de compilación generados como el código compilado.

Así mantendrás la carpeta del ejercicio ordenada y limpia.

**Nota: la primera vez que se llama a cmake, el testlib se descargará automáticamente. El testlib es necesario para que funcionen las pruebas unitarias.

Como vas a ejecutar CMake para crear las instrucciones de compilación de cada ejercicio, quizás quieras crear un script de bash (Linux/MacOS) o un archivo por lotes (Windows) para este comando.

Una vez que CMake haya creado el entorno de compilación, puedes compilar tu código con el comando adecuado para tu entorno:

  • Linux con make: make
  • Windows con Visual Studio: selecciona Build / Build Solution en el menú.
  • Windows con MingW: mingw32-make.exe
  • Windows con nMake: nmake.exe
  • MacOS con Xcode: selecciona Build en la barra de herramientas.

A continuación se muestran ejemplos de cómo ejecutar CMake en distintos entornos.

Linux\MacOS con Make

El nombre del generador para CMake es Unix Makefiles. Suponiendo que el ejercicio actual es bob y que estás en la carpeta del ejercicio:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

Este ejemplo muestra cómo crear archivos vacíos para la implementación antes de ejecutar CMake.

Simplemente escribe make en el directorio build para compilar las pruebas. Esto debería generar errores de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando todos los errores de compilación estén corregidos, ejecuta las pruebas:

$ ctest -V

Windows con Visual Studio 2017

El nombre del generador para CMake es Visual Studio 15. El mismo generador admite todas las ediciones del IDE de Visual Studio 2017: Community, Professional y Enterprise. Suponiendo que el ejercicio actual es bob y que estás en la carpeta del ejercicio:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "Visual Studio 15" ..

Este ejemplo muestra cómo crear archivos vacíos para la implementación antes de ejecutar CMake.

Windows con MingW

El nombre del generador para CMake es MinGW Makefiles. Suponiendo que el ejercicio actual es bob y que estás en la carpeta del ejercicio:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "MinGW Makefiles" ..

Este ejemplo muestra cómo crear archivos vacíos para la implementación antes de ejecutar CMake.

Simplemente escribe make en el directorio build para compilar las pruebas. Esto debería generar errores de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando todos los errores de compilación estén corregidos, ejecuta las pruebas:

MacOS con Xcode

El nombre del generador para CMake es Xcode. Suponiendo que el ejercicio actual es bob y que estás en la carpeta del ejercicio:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..

Este ejemplo muestra cómo crear archivos vacíos para la implementación antes de ejecutar CMake.

Simplemente escribe make en el directorio build para compilar las pruebas. Esto debería generar errores de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando todos los errores de compilación estén corregidos, ejecuta las pruebas:

$ ctest -V

Testlib

Las pruebas dependen de una pequeña biblioteca llamada testlib, que se descarga de GitHub la primera vez que se configura la compilación con cmake.

Si la descarga falla, se puede hacer manualmente, por ejemplo.

mkdir testlib
cd testlib
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/CMakeLists.txt
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/TesterMain.f90