D言語でテスト
If no configurations are specified, dub automatically tries to detect the two default configurations "application" and "library". The "application" configuration is only added if at least one of the following files is found: source/app.d, source/main.d, source/<package name>/app.d, source/<package name>/main.d, src/app.d, src/main.d, src/<package name>/app.d, src/<package name>/main.d. Those files are expected to contain only the application entry point (usually main()) and are only added to the "application" configuration.
configuratinos
を明示的に指定していない場合、app.d
などがあると application として認識される。ない場合は library で main
関数があってもライブラリとしてビルドされる。
app.d
などの検知の仕組みは dub test
時にも使われているようで、dub test
時は app.d
が無視されれ、別の main 関数を設定する。そのため、app.d
以外に main 関数を書くとビルドエラーになる。もちろん app.d
に書いた unittest
も無視される。
unittest は silly を使うと綺麗になる。
package.d のテストは走らないことに注意。通常は↑のルールに則りmain関数が自動的に削除されるが、そうでない場合はカスタムが必要。main文の除外に
version(unittest){
}else{
main() {}
}
が紹介されているが、dub.json
の方で除外するのもありかな。
{
"name": "unittest",
"dependencies": {
"silly": "~>1.1.1"
},
"excludedSourceFiles": ["source/app.d"]
}
カバレッジを取るなら dub test --coverage
と実行する。dub.json
に書くなら以下の通り。
{
"name": "unittest",
"dependencies": {
"silly": "~>1.1.1"
},
"excludedSourceFiles": [
"source/app.d"
],
"buildOptions": ["coverage"]
}
カバレッジありを切り替えたい場合は dub のオプションを使った方が楽そう。ソースファイルが大量にある場合、大量の .lst
ファイルができるので注意。-
から始まるファイルができることもあるので削除もちょっと工夫が必要。
find . -name '*.lst' | xargs rm
vscode の code-d ではカバレッジに合わせて色をつけてくれる。ついたりつかなかったりでちょっと条件がよくわからないが、エディタにコードを表示した状態で dub test
を実行すると反応してくれそう。
dshould を使うと assert
よりもエラーの結果が見易くなる。assert
ではどういう値になるべきか、は見えるがどういう値になったからエラーなのかが不明。dshould
ではエラー時に以下のような出力になる。
dshould.ShouldType.FluentExceptionImpl!(unit_threaded.exception.UnitTestException).FluentExceptionImpl thrown from source/dcov/lib.d on line 18: Test failed: expected 3, but got 4
カバレッジ
-home-...
となっているものと .dub-...
となっているものは、自身のコードではなくライブラリなどもカバレッジレポート(/
と -
にするため、/home/user
が -home-user
になる)。レポートファイルは相対パスなので、source
にしかコードを置いていない場合は以下のコマンドで不要なものを削除できる。
find . -name "*.lst" | grep -v "\./source" | xargs rm
code-d ではルートディレクトリにカバレッジレポートがなくても反応する。また、touch
でハイライトがつくのでファイルチェンジに反応している模様。
dub test --coverage
で出力されるカバレッジファイルはカレントディレクトリに出力される。そのため、dub test --root <path> --coverage
とすればディレクトリを汚さずに済む。