2023-03-26

F#でコマンドレットを書いてる pt.17

krymtkts/pocof の話。

もう 4 月なのでそろそろ Fable Compiler を試してみたいと思ってるが、 pocof のテスト書くのと bugfix が落ち着かず、できていない。 ちょっと今までのテストを小綺麗にする作業にも取り組んだ。

前回module を多層化することでテストケースをグルーピングしている話を書いた。 その時はテストケースを 1 つのファイルにまとめて書いていたのだけど、 PocofQuery.run のテストを書き始めるにあたり、テストケースが爆増するのに備えてファイルを分割したいと思っていた。

はじめ F# ではどうテストプロジェクトのファイル分割をするのかわからなかったが、 F# の repo をいくつか参照してみて fsprojects/FSharp.Data.Adaptive が参考になりそうとわかった。 それを pocof に提供したところ、上手く分割できた。要は普通の F# Project と同じようにするだけだった。コミットは krymtkts/pocof@dff10c8

FSharp.Data.Adaptive/src/Test/FSharp.Data.Adaptive.Tests がテストプロジェクトのディレクトリ。 ここに分割されたテストコードのファイルが色々あるのと、テストプロジェクトのエントリポイントになる Program.fs が配置されている。 プロジェクト FSharp.Data.Adaptive.Tests.fsproj を参照するとエントリポイント Program.fs が最後の読み込みなっているのがわかる。 それ以前のファイルにモジュールを小分けにしたテストを書いたら良い。

ファイル分割の粒度はモジュール別に 1 ファイルした。 あまり細かく分けると何処にテストを書くか悩みがちなので、シンプルにモジュールと対にしている。複雑なクエリのテストを書くとまた量が増えて更にファイルを分割したくなるだろうが、今ではない。

ひとまず満足な形に分解できたのでヨシ。


あとこの fsprojects/FSharp.Data.Adaptive を参考にしたとき気づいたのだけど、 FsCheck というモジュールを使ってるようだった。 Property-based Testing をするためのやつだ(今書いてるのは所謂「おなじみ」の Example-based Testing という)。 The 'Property Based Testing' series | F# for fun and profit が参考になった。

実際 pocof でもテストケースが貧弱で、テストは成功するがバグってたようなケースがもちらほらあるので、こういうより強力な方法を使うのが良いかもなーと興味深く思っている。 とはいえ興味の範囲で無限にやること増えていく。 かなりやってみたいのだけど、キャッチアップのほうが追いついてない感じ。

まずは所謂「おなじみ」の Example-based Testing である程度カバーしてから、 FsCheck で強化するってステップを踏むのが良さげ。徐々に... ひとまず今ある draft の pull request を merge してから、今後どう取り組んでいくか考えよかな(タスクを未来にブン投げる)。