💭

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());

たったこれだけです。

これで実際にどのように画像比較されるのかは、以下の記事が参考になります。
https://zenn.dev/acn_jp_sdet/articles/74fbda5f9142b6

活用例

// 差分が許容値を超えた場合
if (diff.hasDiff() && diffRatio > diffThreshold) {
    throw new AssertionError(
        String.format("スクリーンショット比較失敗: %s (差分率: %.2f%%, 許容率: %.2f%%)",
        screenshotName, diffRatio * 100, diffThreshold * 100));
}

上記のようにすると、JUnitのテスト内で以下のように差分検知できます。

Discussion