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にもテストをきちんと行う文化を根付かせたいですね(まずは自分がやらないといけませんが……)