Exercism에서 Fortran 연습 문제를 테스트하는 방법을 알아봐요.
각 연습 문제에는 단위 테스트와 CMake 빌드 레시피가 함께 들어 있어요. 구현은 직접 작성해요. 각 테스트 파일은 여러분의 구현과 링크되어 테스트를 실행하는 콘솔 실행 파일을 만들어요. 테스트 실행 파일을 실행하면 실패한 테스트마다 메시지를 출력하고, 테스트가 실패하면 0이 아닌 종료 상태를 반환해요.
테스트 파일의 이름은 <exercise>_test.f90이에요. 따라서 "Bob" 연습 문제에서 테스트가 들어 있는 파일은 bob_test.f90이에요. 각 테스트에는 테스트를 설명하는 주석이 먼저 나오고, 그다음 call assert_equal로 시작하는 실제 테스트가 나와요. 예를 들면 다음과 같아요.
! Test 16: non-letters with question
call assert_equal("Sure.", hey(":) ?"), "non-letters with question")
테스트를 비활성화하려면 '!'로 주석 처리하면 돼요. 예를 들면 다음과 같아요.
! Test 16: non-letters with question
! call assert_equal("Sure.", hey(":) ?"), "non-letters with question")
각 연습 문제를 풀어 나가는 과정은 다음과 같아요.
각 연습 문제에는 단위 테스트와 함께 CMakeLists.txt 파일이 들어 있어요. 이 파일에는 빌드를 대신 처리해 주는 미리 만들어진 CMake 레시피가 담겨 있어요. 이 파일은 따로 수정할 필요가 없어요. 제공된 레시피는 구현이 연습 문제 이름을 딴 소스 파일에 들어 있다고 가정해요.
예를 들어 "Bob" 연습 문제는 bob.f90 파일에 구현이 있다고 가정해요.
CMake를 실행하기 전에 초기 구현 파일을 먼저 만들어요.
"Bob" 연습 문제에서 CMake를 실행할 때 bob.f90 파일이 없으면, CMake가 파일을 찾을 수 없다는 오류를 내요.
파일 내용은 비어 있어도 괜찮지만, 파일 자체는 있어야 해요.
이 레시피를 이용하면 CMake는 적절한 제너레이터와 연습 문제 디렉터리 위치를 지정해 cmake -G를 실행함으로써 환경에 맞는 프로젝트를 만들어 줘요. CMake는 운영체제에 맞는 빌드 스크립트를 생성해요. 이렇게 생성된 파일을 연습 문제 소스 코드와 분리해 두려면, 생성된 빌드 파일과 컴파일된 코드를 담을 build 디렉터리를 만드는 것이 일반적이에요.
이렇게 하면 연습 문제 폴더를 깔끔하게 유지할 수 있어요.
**참고: cmake를 처음 호출하면 testlib이 자동으로 내려받아져요. 단위 테스트가 동작하려면 testlib이 필요해요.
연습 문제마다 빌드 설정을 만들기 위해 CMake를 실행하게 되니, 이 명령을 담은 bash 스크립트(Linux/MacOS)나 배치 파일(Windows)을 만들어 두는 것도 좋아요.
CMake가 빌드 환경을 만들어 주면, 환경에 맞는 명령으로 코드를 빌드할 수 있어요.
make
mingw32-make.exe
nmake.exe
다음은 여러 환경에서 CMake를 실행하는 예를 보여줘요.
CMake에서 사용하는 제너레이터 이름은 Unix Makefiles예요.
현재 연습 문제가 bob이고 연습 문제 폴더에 있다고 가정해요.
$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make
이 예에서는 CMake를 실행하기 전에 빈 구현 파일을 만들어요.
빌드 디렉터리에서 make를 입력하면 테스트가 컴파일돼요. 그러면 컴파일 오류가 생겨요. 오류를 고친 뒤 make를 다시 실행해요.
빌드 오류를 모두 고치면 테스트를 실행해요.
$ ctest -V
CMake에서 사용하는 제너레이터 이름은 Visual Studio 15예요. 같은 제너레이터가 Visual Studio 2017의 모든 IDE 에디션, 즉 Community, Professional, Enterprise를 지원해요. 현재 연습 문제가 bob이고 연습 문제 폴더에 있다고 가정해요.
> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "Visual Studio 15" ..
이 예에서는 CMake를 실행하기 전에 빈 구현 파일을 만들어요.
CMake에서 사용하는 제너레이터 이름은 MinGW Makefiles예요. 현재 연습 문제가 bob이고 연습 문제 폴더에 있다고 가정해요.
> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "MinGW Makefiles" ..
이 예에서는 CMake를 실행하기 전에 빈 구현 파일을 만들어요.
빌드 디렉터리에서 make를 입력하면 테스트가 컴파일돼요. 그러면 컴파일 오류가 생겨요. 오류를 고친 뒤 make를 다시 실행해요.
빌드 오류를 모두 고치면 테스트를 실행해요.
CMake에서 사용하는 제너레이터 이름은 Xcode예요.
현재 연습 문제가 bob이고 연습 문제 폴더에 있다고 가정해요.
$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..
이 예에서는 CMake를 실행하기 전에 빈 구현 파일을 만들어요.
빌드 디렉터리에서 make를 입력하면 테스트가 컴파일돼요. 그러면 컴파일 오류가 생겨요. 오류를 고친 뒤 make를 다시 실행해요.
빌드 오류를 모두 고치면 테스트를 실행해요.
$ ctest -V
테스트는 testlib이라는 작은 라이브러리에 의존하는데, 이 라이브러리는 cmake로 빌드를 처음 구성할 때 github에서 내려받아져요.
내려받기가 실패하면 직접 수동으로 내려받을 수도 있어요. 예를 들면 다음과 같아요.
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