SATySFiパッケージでユニットテストを行う方法
概要
assert-eqパッケージ・debug-show-valueパッケージ・GitHub Actionsを組み合わせることでSATySFiにもユニットテストを導入することができます。
参考になる記事へのリンク
assert-eqパッケージについては「SATySFiでテストをするためのパッケージ」を、debug-show-valueパッケージについては「SATySFiでlistやoptionなどを文字列化して表示する方法」を、GitHub ActionsでSATySFiを使う方法は「GitHub Actions で SATySFi の文書やパッケージの CI」を、それぞれ参照してください。
testファイルを作る
例えば、以下のようなパッケージでは、
%mypackage.satyh @require: assert-eq/assert-eq @require: debug-show-value @require: list module: MyPackage :sig val my-list-map : ('a -> 'b) -> 'a list -> 'b list val +test : [] block-cmd end = struct open AssertEq open DebugShowValue let my-list-map = List.map let ctx +test = let () = assert-eq ?:(`check my-list-map`) (show-list show-int) (my-list-map ((+) 1) [1;2;3]) ([2;3;4]) in block-nil end
などのようにしてテスト用コマンドを作り、+test : [] block-cmd
として外部に出せば、簡単にテストが行えます。
内部のみで使う関数も、ユニットテストを行うことができます。
testフォルダ内にtest.saty
を作成し、
@require: stdjareport @import: ../mypackage document (| title = {}; author = {}; |) '< +MyPackage.test; >
と、中に書き込めば、このファイルをコンパイルするだけでテストに成功しているか失敗しているかがわかるようになります。
CIを回す
satysfi-dockerをGitHub Actionsで使うことで、CIを回すことができます。
リポジトリ内に.github/workflows
というフォルダを作り、その中にci.yml
というファイルを作ります。
その中に
name: CI on: [push,pull_request] #pushとPRの際にCIが回るようにする jobs: #job定義 test: #jobの名前 runs-on: ubuntu-latest #ubuntuでの実行 strategy: matrix: version: [0.0.4] #SATySFiのバージョンは0.0.4でする。0.0.4-dev2020.02.22などのようにすれば開発版も使える。 container: image: amutake/satysfi:${{ matrix.version }} steps: - uses: actions/checkout@v1 # opamとsatyrographosを使って依存パッケージをインストールする - run: | export HOME=/root eval $(opam env) opam update opam install satysfi-assert-eq opam install satysfi-debug-show-value satyrographos install satysfi test.saty working-directory: ./test # ↑testフォルダでの実行
という風に書き込んでpushすれば、次からpushやPRをするたびにCIが回るようになります。
SATySFiのバージョンを変えたいときや、依存パッケージがさらにある場合には自分なりに改造してみてください。
おわりに
SATySFiにもテストをきちんと行う文化を根付かせたいですね(まずは自分がやらないといけませんが……)