给AI图像生成器写回归测试,第一反应通常是存一张"标准答案"图片,下次生成后逐像素对比。这个思路在传统渲染管线里没问题,但放到非确定性的快速生图模式里,方向就错了。

像素快照不是正确的契约。真正有用的回归测试,应该冻结请求本身,然后断言结果中的稳定属性:文件格式、尺寸、构图区域、必需文字、调色板容差。它应该在创意需求被破坏时失败,而不是因为一颗浆果移动了三个像素就报警。

打开网易新闻 查看精彩图片

从模型契约开始

以Z Image Turbo工作区为例,2026年9月2日的实时界面显示:FLUX Dev模型、1:1比例、单张输出、带水印的公开生成,单次消耗9个积分。当前schema还暴露了go_fast=true、guidance 3、28步推理、一兆像素、WebP输出,以及一个可选种子值。

schema里明确警告:即使设置了种子,快速模式也不是确定性的。种子可以记录用于追踪,但别把它当成逐字节一致的虚假保证。

测试用的提示词应该包含可断言的实体名词。比如这样一段:黑森林蛋糕居中放在深色桌面上,边缘环绕覆盆子,三维红色蛋糕字母拼出"FLUX DEV",美食摄影风格,单一柔和主光,方形裁切,无额外文字。

定义语义图像契约

把请求和测试放在一起存储。一个典型的契约对象长这样:路由指向/z-image-turbo-generator/,模型是FLUX Dev,宽高比1:1,输出1张,快速模式开启,必需文字是"FLUX"和"DEV",必需区域包括居中主体、深色背景、红色点缀。

然后要把硬失败和审查信号区分开。无效媒体格式、错误尺寸、主体缺失、必需文字没出现——这些属于硬失败,测试必须报错。而调色板轻微偏移或裁切略有出入,可以生成一个审查工件,而不是让每次构建都红掉。

验证元数据和视觉区域

下面这个Node示例用sharp库检查尺寸和区域统计。OCR可以用项目里已经信任的引擎接入。

import assert from "node:assert/strict";import sharp from "sharp";export async function inspectGeneratedImage(path) {const image = sharp(path);const meta = await image.metadata();assert.equal(meta.format, "webp");assert.equal(meta.width, meta.height, "expected a square output");assert.ok((meta.width ?? 0) >= 1024, "output is below the contract size");const { channels } = await image.resize(64, 64, { fit: "fill" }).stats();const red = channels[0].mean;const green = channels[1].mean;assert.ok(red > green * 1.08, "red cake-letter accent is no longer dominant");return { width: meta.width, height: meta.height, red, green };}

这段代码做了四件事:确认输出是WebP格式、宽高相等、分辨率不低于1024、红色通道均值比绿色高8%以上。最后一条用来验证红色蛋糕字母的视觉主导性还在。

不要把这个输出和跨机器的精确RGB基线做对比。不同的编码器、模型版本和快速推理路径,都会产生无害的细微差异。逐像素对比在这里只会制造噪音。

把OCR做成定向断言

OCR之前先裁切到预期文字区域。整图OCR会把浆果、蜡烛或反光误认成字母,导致误报。

const expected = new Set(["FLUX", "DEV"]);const observed = new Set(ocrText.toUpperCase().match(/[A-Z]+/g) ?? []);for (const word of expected) {if (!observed.has(word)) {throw new Error(`missing generated word: ${word}`);}

裁切坐标要按图像尺寸做比例计算,不要写死像素值。这样即使生成尺寸有合理浮动,测试依然稳定。

回归测试测的是需求,不是像素

非确定性生成器的回归测试,本质上是把"这张图看起来对不对"翻译成一组可计算的属性断言。文件契约、尺寸、构图区域、必需文字、调色板容差——这些才是创意需求的可验证投影。

当生成结果里蛋糕还在、字母还在、红色还在,只是覆盆子的位置挪了几像素,测试应该通过。只有当主体消失、文字缺失、格式错误时,测试才应该亮红。这才是对非确定性生成器正确的测试姿态。