test: 零依赖对拍测试台(可在不改 dist/ 的前提下复现 WE 行为)

tools/serve.mjs    本地静态服务 + 测试驱动注入(模拟 WE 下发用户属性、冻结动画相位、藏 canvas 取参考帧)
tools/cdp.mjs      最小 CDP 客户端(真实时间等待;--screenshot 的虚拟时间会在骨骼加载完成前就耗尽)
tools/shot.mjs     截图/取状态,就绪判据可传入
tools/diff.mjs     ffmpeg 差分:PSNR / SSIM / 平均亮度差
tools/capture.mjs  对拍矩阵:壁纸 × 分辨率 × (正常, 藏 canvas)

实测:xilian 1920x1080 spine 层贡献 mean|diff|=26.1/255,kv37 为 10.2/255,
同配置两次截图噪声底 0.68/255。
This commit is contained in:
Shuery committed 2026-09-19 19:13:57 +08:00
1 parent d8c7e492f7
commit 399f99edd7
7 files changed
+499

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
// 两张 PNG 的数值对拍:PSNR / SSIM / 平均亮度差(0-255)。
// 用法:node tools/diff.mjs <a.png> <b.png> [diff-out.png]
// 判读:平均差 < 1 视为肉眼无差异;1-3 为细微;> 8 通常意味着构图/内容变了。
import { spawn } from "node:child_process";
const [a, b, outPng] = process.argv.slice(2);
if (!a || !b) {
console.error("usage: node tools/diff.mjs <a.png> <b.png> [diff-out.png]");
process.exit(2);
}
function ff(args) {
return new Promise((resolve) => {
const p = spawn("ffmpeg", ["-hide_banner", "-loglevel", "info", ...args], { stdio: ["ignore", "pipe", "pipe"] });
let err = "";
p.stderr.on("data", (d) => (err += d));
p.stdout.on("data", () => {});
p.on("close", () => resolve(err));
});
}
const psnr = await ff(["-i", a, "-i", b, "-lavfi", "psnr", "-f", "null", "-"]);
const ssim = await ff(["-i", a, "-i", b, "-lavfi", "ssim", "-f", "null", "-"]);
const yavg = await ff([
"-i", a, "-i", b,
"-lavfi", "blend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG",
"-f", "null", "-",
]);
const num = (text, re) => {
const m = text.match(re);
return m ? Number(m[1]) : NaN;
};
const yavgs = [...yavg.matchAll(/YAVG=([\d.]+)/g)].map((m) => Number(m[1]));
const report = {
psnr_avg: /average:inf/.test(psnr) ? Infinity : num(psnr, /average:([\d.]+)/),
ssim_all: num(ssim, /All:([\d.]+)/),
mean_abs_diff: yavgs.length ? yavgs[yavgs.length - 1] : NaN,
};
console.log(`psnr=${report.psnr_avg} dB ssim=${report.ssim_all} mean|diff|=${report.mean_abs_diff}/255`);
if (outPng) {
await ff(["-y", "-i", a, "-i", b, "-lavfi", "blend=all_mode=difference", "-frames:v", "1", outPng]);
console.log(`diff image -> ${outPng}`);
}