Open7

D言語でテスト

nonanonnononanonno

https://dub.pm/package-format-json.html#configurations

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も無視される。

nonanonnononanonno

unittest は silly を使うと綺麗になる。

https://qiita.com/lempiji/items/4e2968208a8dd9b17ead

package.d のテストは走らないことに注意。通常は↑のルールに則りmain関数が自動的に削除されるが、そうでない場合はカスタムが必要。main文の除外に

version(unittest){

}else{
    main() {}
}

が紹介されているが、dub.json の方で除外するのもありかな。

		{
			"name": "unittest",
			"dependencies": {
				"silly": "~>1.1.1"
			},
			"excludedSourceFiles": ["source/app.d"]
		}
nonanonnononanonno

カバレッジを取るなら 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 を実行すると反応してくれそう。

nonanonnononanonno

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
nonanonnononanonno

カバレッジ

-home-... となっているものと .dub-... となっているものは、自身のコードではなくライブラリなどもカバレッジレポート(/- にするため、/home/user-home-user になる)。レポートファイルは相対パスなので、source にしかコードを置いていない場合は以下のコマンドで不要なものを削除できる。

find . -name "*.lst" | grep -v "\./source" | xargs rm
nonanonnononanonno

code-d ではルートディレクトリにカバレッジレポートがなくても反応する。また、touch でハイライトがつくのでファイルチェンジに反応している模様。

nonanonnononanonno

dub test --coverage で出力されるカバレッジファイルはカレントディレクトリに出力される。そのため、dub test --root <path> --coverage とすればディレクトリを汚さずに済む。