Nimble+unittestモジュールでテストを書く
nimbleを使用してnimble initでプロジェクトを作成したときtestsというディレクトリが生成される testsディレクトリ配下にtで始まるファイル名nimというファイルを作成すると、nimble test時にテストが走る
例:test1.nim
以下にproctestというモジュールを作成し、テストする例を記す
ディレクトリ構成
code:text
プロジェクトルート/
┣ src/
┃ ┗ proctest.nim
┗ tests/
┗ test1.nim
code:proctest.nim
proc plus(x, y: int): int =
return x + y
code:test1.nim
import unittest
include proctest
suite "plus":
test "1 + 1":
check plus(1, 1) == 2
test "-1 + 1":
check plus(-1, 1) == 0
proctest.plusプロシージャは*をつけていないため、非公開プロシージャである
非公開プロシージャをテストするにはincludeを使用する
ただし、includeを使用するとincludeしたモジュールにかかれているwhen isMainModuleブロックのコードまでテストコードのファイル内に展開されてしまい、テスト時に実行されてしまう
このことは、includeするモジュール内にquit 0などのプロセスを終了するコードを含められないことを意味する
回避策1
1. たとえば実行ファイルとしてのメイン処理を実装しているモジュールにはプロシージャは書かない
2. テストしたいプロシージャは別モジュールに分ける
3. メインからはそれをincludeする
回避策2
1. メイン処理のブロックをwhen isMainModuleからwhen isMainModule and not defined modeTestと書く
2. testsディレクトリ配下に以下のファイルを配置、あるいは追記する
code:tests/config.nims
switch("d", "modeTest")
意味
nimble testが実行される時はtests/config.nimsが読み込まれる
読まれる時にmodeTestというフラグを立てる
メインのモジュールがincludeされたときにmodeTestが立ってる場合はメインブロックが処理されなくなる