💭
aShot で簡単にVRTを行う
前置き
この記事は以下二つの知識があればより有効に活用しやすいです。ぜひ読んでいただければ。
Playwright(Java)の基礎知識:https://zenn.dev/izumi_ren/articles/aa3aa432f33b69
Playwright + JUnit の書き方:https://zenn.dev/izumi_ren/articles/07d6906e23f6cd
また、Java(Spring)のアプリを前提としています。
aShotの導入
aShotは画像比較ができるOSSです。かなり簡単に導入できます。
pom.xml
<dependency>
<groupId>ru.yandex.qatools.ashot</groupId>
<artifactId>ashot</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
build.gradle
dependencies {
testImplementation 'ru.yandex.qatools.ashot:ashot:1.5.4'
}
※バージョンは状況によって最適なものを選んでください。
使い方
// 基準となる画像と比較対象の画像を読み込む
BufferedImage baseImage = ImageIO.read(basePath.toFile());
BufferedImage actualImage = ImageIO.read(actualPath.toFile());
// 画像比較実行
ImageDiffer imgDiff = new ImageDiffer();
ImageDiff diff = imgDiff.makeDiff(baseImage, actualImage);
// 差分率を計算
int totalPixels = baseImage.getWidth() * baseImage.getHeight();
double diffRatio = (double) diff.getDiffSize() / totalPixels;
/// 差分画像を保存
Path diffPath = Paths.get("target/diff.png");
BufferedImage diffImage = diff.getMarkedImage();
ImageIO.write(diffImage, "png", diffPath.toFile());
たったこれだけです。
これで実際にどのように画像比較されるのかは、以下の記事が参考になります。
活用例
// 差分が許容値を超えた場合
if (diff.hasDiff() && diffRatio > diffThreshold) {
throw new AssertionError(
String.format("スクリーンショット比較失敗: %s (差分率: %.2f%%, 許容率: %.2f%%)",
screenshotName, diffRatio * 100, diffThreshold * 100));
}
上記のようにすると、JUnitのテスト内で以下のように差分検知できます。

Discussion