この記事は SATySFi Advent Calendar 2019 14日目の記事です。13日目はしょうだいさんの「SATySFiでD論を書いた話」でした。
SATySFiで組版ライブラリを書いていると組版の結果の確認を自動化したいと思うことがしばしばあります。現在 satysfi-base の組版ライブラリに回帰テストを導入を試みているところで、とりあえず最低限のものが出来上がったので、どういう風に使うものかをこの記事で紹介します。(2019/12/28)無事マージされました
回帰テストとは
コードに新機能を加えたりリファクタリングをした際に、その変更が既存の機能を壊してないかというのはプログラマの心配の種です。そこで既存の機能の確認をうまいこと自動化できれば、手間の削減にもプログラマの精神衛生にも寄与するわけです。そういう目的のためのテストを回帰テストと呼びます。
具体的に言うと今回やりたい回帰テストの手順は以下のようになります。
- 新機能を追加する際は、その機能のテスト用のコードとその時点の組版結果も追加する
- 機能に変更があった際には、テストコードから組版結果を再出力して
- もとの結果と同じ → ヨシ!
- もとの結果と違う → 差分を報告してプログラマに確認させる
- 以下繰り返し
回帰テストを動かす
実際に satysfi-base の回帰テストを動かしてみましょう。今回の進捗は visual-regression-test ブランチに置いてあります。もう少し完成度を高めてからmasterに入れてもらう予定です。
組版ライブラリのテストには Jest を使っています。Javascriptを使っているのはフロントエンド回りの資産を流用したいというのが主な理由で、実際に jest-image-snapshot がテストの仕事の大半をやってくれています。
セットアップ
テストの実行には SATySFi と Yarn と GraphicsMagick が必要です。予めインストールしておきましょう。GraphicsMagickはUbuntuならsudo apt install graphicsmagick
でインストールできます。
然る後に yarn install
で依存関係を解決してから yarn test
でテストを実行できます。
今回テストしているのは導出木を書くためのDerive
モジュールです(紹介記事はこちら)。チェックマーク付きの"renders ..."の行がそれぞれSATySFiのソースコードをコンパイルして出力結果を確認するテストになっています。毎回コンパイルしているので1テストに2,3秒くらいかかっちゃっていますね。まあそんなもんです。
既存の機能を変更する
Derive
ではデフォルトのラベルの位置は左側なのですが、これを右に変更したことにしましょう。そうすると既存の機能が変更されたため、yarn test
は失敗するようになります。
組版の出力結果が既存のものと違う場合には、jest-image-snapshotがご丁寧にdiffをとって報告してくれます。上のテスト結果の "See diff for defails: ..." にある差分画像は以下のようになっています。
今のところStdJaを使ってるので本当にテストしたい導出木のパートは真ん中のちっこいやつです。すみません、このあたりを調整してる時間がなかったんや… (standalone-likeなクラスファイルが追加されたので解決されました。)
画像の左が既存の出力(ラベルが左)、右が現在の出力(ラベルの右)になっていて、真ん中にdiffが表示されています。このdiffは差分がわずかな場合に役に立ちますが、今回は変更点が明らかなのであんま気にしなくて大丈夫です。他の失敗したテストについても同様の画像が出力されており、これらを見れば出力結果の変更が期待したものであることを確認できるようになっているわけです。
現在の出力を既存のものとして上書きする
差分画像に問題がなければyarn test --updateSnapshot
で現在の結果を既存の結果として上書きすることができます(ところで記録してある既存の結果のことを snapshot と呼びます)。スクリーンショットの下部で4つのSnapshotが更新されているのが確認できると思います。
まとめ
以上SATySFiで回帰テストやるとしたらこんな感じかなというのを紹介しました。この記事ではテストのコードの詳細には立ち入りませんが、__test__
ディレクトリに置いてあるので興味のある方はご覧ください。
明日の15日目の記事はわさびずさんの「satysfi-base (旧 satysfi-lib) の宣伝」です。ではではー