ならば

音とかで遊んでいたログ

LilyPondの回帰テスト

LilyPondの回帰テストについて調べたのでメモ。特に出力された楽譜の画像の比較について。

回帰テストとはソフトウェアテストの一種で、プログラムを変更したときに今まで動いていた他の(意図した箇所とは違う)部分にまで影響が及んでいないかを確認するために行われる。

プログラムに何らかの変更を加えるたびに実行するのが望ましいが、プログラムが大きいと確認しないといけない機能の数が膨大になり、テストの実行も人間がやると時間がかかる。でも単純で同じことの繰り返しになる部分も多いのでそこはコンピュータにやってもらおう、ということでできる範囲で自動化されることもよくある。

LilyPondにも部分的に自動化された回帰テストがある。テスト項目はLilyPond Regression Tests。LilyPondに新しいバージョン番号が付けられるときに、このテスト項目について新旧のバージョンで出力された楽譜の画像を比較して違いがある部分が意図したものかどうかが確認される。
たとえば、バージョン2.13.5-0と2.13.6-1で違う楽譜の一覧のように違いがあった楽譜のテスト項目だけが自動で一覧化されるので、これを人間が見比べる。


一覧にはテスト項目ごとに上のように楽譜が出力される。左が旧バージョンの出力で、右が新バージョンの出力に「差異」を重ねた画像。右のぼやけた部分が「差異」で、左の楽譜において音符などの要素があったところを表す。

右の画像はImageMagickのツールを使って生成されている。

compare -depth 8 -dissimilarity-threshold 1 旧楽譜.png 新楽譜.png 差.png
convert  -depth 8 差.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity' ぼやけた.png
composite -compose atop -quality 65 ぼやけた.png 新楽譜.png 右の画像.png



今回気になったのは、右の画像をどうやって作っているのか、ということともうひとつ、回帰テストの実行プログラムはどうやって新旧で出力された楽譜が違うと判定しているのか、ということだった。
後者は実は楽譜の画像そのものを比較しているわけではなくて、楽譜上の音符などの要素の位置(数値)を新旧で比較して、それが閾値を超えているかで判定しているようだ。