在 Fortran 軌道上測試

了解如何在 Exercism 上測試你的 Fortran 練習。


每個練習都會提供單元測試和一份 CMake 建置設定,實作則由你來負責。 每個測試檔案都會與你的實作連結,產生一個可執行測試的主控台執行檔。執行測試執行檔時,會為每個失敗的測試印出訊息,並在測試失敗時回報非零的結束狀態。

測試檔案的命名會是<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 建立好建置環境後,你就可以用適合自己環境的指令來建置程式碼:

  • Linux 搭配 make:make
  • Windows 搭配 Visual Studio:從選單中選擇 Build / Build Solution。
  • Windows 搭配 MingW:mingw32-make.exe
  • Windows 搭配 nMake:nmake.exe
  • MacOS 搭配 Xcode:從工具列選擇 Build

以下範例示範如何在不同的環境中執行 CMake。

Linux\MacOS 搭配 Make

CMake 的產生器名稱是Unix Makefiles。 假設目前的練習是bob,而且我們位於練習資料夾中:

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

這個範例展示了在執行 CMake 之前,先為實作建立空的檔案。

只要在 build 目錄中輸入 make 就能編譯測試。這應該會產生編譯時期的錯誤。修正錯誤後,再次執行make。當所有建置錯誤都修正後,執行測試:

$ ctest -V

Windows 搭配 Visual Studio 2017

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 之前,先為實作建立空的檔案。

Windows 搭配 MingW

CMake 的產生器名稱是MinGW Makefiles。假設目前的練習是bob,而且我們位於練習資料夾中:

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

這個範例展示了在執行 CMake 之前,先為實作建立空的檔案。

只要在 build 目錄中輸入 make 就能編譯測試。這應該會產生編譯時期的錯誤。修正錯誤後,再次執行make。當所有建置錯誤都修正後,執行測試:

MacOS 搭配 Xcode

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