Fortranトラックでのテスト

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")

各演習を進める流れは、次のとおりです。

  • CMakeで最初のビルドを作成する
  • 各単体テストについて:
    • コンパイルエラーを解消して、テストを失敗させる。
    • テストに通るだけの最小限の実装をする。
    • 読みやすさを高め、重複を減らすなど、実装をリファクタリングする。
    • 次のテストのコメントを外す

CMakeで最初のビルドを作成する

各演習には、単体テストと一緒に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を使うLinux:make
  • Visual Studioを使うWindows:メニューからBuild / Build Solutionを選択します。
  • MingWを使うWindows:mingw32-make.exe
  • nMakeを使うWindows:nmake.exe
  • Xcodeを使うMacOS:ツールバーからBuildを選択します

さまざまな環境でCMakeを実行する例を以下に示します。

makeを使うLinux\MacOS

CMakeのジェネレーター名はUnix Makefilesです。 現在の演習がbobで、演習のフォルダーにいるとします。

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

この例では、CMakeを実行する前に実装用の空ファイルを作成しています。

テストをコンパイルするには、buildディレクトリでmakeと入力するだけです。これでコンパイル時のエラーが出るはずです。エラーを修正したら、もう一度makeを実行します。すべてのビルドエラーを修正したら、テストを実行します。

$ ctest -V

Visual Studio 2017を使うWindows

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を実行する前に実装用の空ファイルを作成しています。

MingWを使うWindows

CMakeのジェネレーター名はMinGW Makefilesです。現在の演習がbobで、演習のフォルダーにいるとします。

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

この例では、CMakeを実行する前に実装用の空ファイルを作成しています。

テストをコンパイルするには、buildディレクトリでmakeと入力するだけです。これでコンパイル時のエラーが出るはずです。エラーを修正したら、もう一度makeを実行します。すべてのビルドエラーを修正したら、テストを実行します。

Xcodeを使うMacOS

CMakeのジェネレーター名はXcodeです。 現在の演習がbobで、演習のフォルダーにいるとします。

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

この例では、CMakeを実行する前に実装用の空ファイルを作成しています。

テストをコンパイルするには、buildディレクトリでmakeと入力するだけです。これでコンパイル時のエラーが出るはずです。エラーを修正したら、もう一度makeを実行します。すべてのビルドエラーを修正したら、テストを実行します。

$ ctest -V

Testlib

テストは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