Clojureで実践的なテストの書き方
Clojureプロジェクトにおけるテストについて、知見がたまっていない気がするので少しずつ書き出していくことにする。
clojure.testを使う、もしくはそれに準じるテストランナーを使う
これについては以前に少しだけ書いたのだけど、clojure.test.checkなどを使うときに自然に利用できる方がいいため
https://qiita.com/ayato_p/items/7aa4b8f2d4d2c0f258df#%E6%9C%80%E5%BE%8C%E3%81%AB
fudjeを利用する
Clojureはあまりネストしたデータ構造同士を比較するのが得意ではないので、それを補うために利用する
逆にそれ以外の機能は利用しない
テストの並列化を意識する
テストを書く重要性は増している
テストが増えていき、テスト時間が数時間にもなるというケースが多い
伸びてしまったテスト時間を手っ取り早く短くする最も単純な方法は並列化
並列化をするためのポイントは
alter-var-rootやwith-redefs、それに準ずる手段で関数をテスト時に差し替えない
Midjeやfudjeなどの用意しているマクロでも、内部的にはwith-redefsを利用しているため使わない
差し替えたくなるポイントをプロトコルを利用するなどして、適切に切り出しテスト時に差し替えることができれば解決できる
ライフサイクルのあるリソースを動的Varやそれに準じる手段で管理しない
ComponentやIntegrantを利用する
Mountについてはmount-liteという別のプロジェクトを使うと良いらしいが詳細は不明
データベースなども並列に利用できるようにする
ref. http://blog.ayalog.com/2017/09/17/parallel-test-with-postgresql-in-clojure.html
clojure.specを活用する
まだ、「これだ」という感じの方法は見つけられていない
ref. clojure.specを利用した場合のテストの書き方について
#wip #Clojure #テスト