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 -Gを実行することで、環境に合ったプロジェクトをCMakeで生成できます。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を実行する前に実装用の空ファイルを作成しています。
テストをコンパイルするには、buildディレクトリで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を実行する前に実装用の空ファイルを作成しています。
テストをコンパイルするには、buildディレクトリでmakeと入力するだけです。これでコンパイル時のエラーが出るはずです。エラーを修正したら、もう一度makeを実行します。すべてのビルドエラーを修正したら、テストを実行します。
CMakeのジェネレーター名はXcodeです。
現在の演習がbobで、演習のフォルダーにいるとします。
$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..
この例では、CMakeを実行する前に実装用の空ファイルを作成しています。
テストをコンパイルするには、buildディレクトリで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