告别手动点点点的测试:用AI为TypeScript游戏生成全自动测试套件
📌 摘要
很多开发者用AI生成游戏代码后,测试方式依然是:自己玩两局,觉得没问题就发布。结果用户遇到边界条件(比如同时合成10个道具、网络断线重连、分数溢出),直接闪退。
AI不仅能写代码,还能帮你写测试代码。本文教你一套提示词方法,让AI基于你的游戏逻辑自动生成单元测试、集成测试、边界测试。配合TypeScript的类型系统和Jest/Vitest,实现高覆盖率自动化测试流水线。
一、为什么小游戏需要自动化测试?
| 痛点 | 手动测试 | 自动化测试 |
|---|---|---|
| 回归Bug | 改一行代码,测一遍全流程,耗时1小时 | 10秒跑完所有用例 |
| 边界条件 | 很难想到“99级升100级经验溢出”这类场景 | AI自动生成边界值测试 |
| 平台差异 | 微信/抖音/H5分别测,重复劳动 | 同一套测试逻辑,不同适配器跑 |
| 修改信心 | 不敢重构,怕崩 | 测试全绿,大胆优化 |
👉 一套好的自动化测试 = 代码修改的“安全网” + 发布前的“守门员”。
二、AI能帮你测试什么?
| 测试类型 | 说明 | AI能做什么 |
|---|---|---|
| 单元测试 | 测试单个函数/类 | 根据函数签名自动生成用例(正常值、边界值、异常值) |
| 集成测试 | 测试模块间交互 | 模拟游戏核心逻辑 + 适配器交互 |
| 状态机测试 | 测试游戏状态流转 | 自动生成状态转换图,并测试非法转换被拒绝 |
| 随机事件测试 | 测试概率/随机算法 | 多次运行,统计分布是否符合预期 |
| 性能测试 | 测试帧率/内存 | AI生成大量操作序列,测量耗时 |
三、实战:用AI生成测试套件
第1步:配置测试框架(让AI帮你写配置)
提示词:
“我的项目是TypeScript小游戏,使用Vitest作为测试框架。请生成:
vitest.config.ts配置文件
package.json中的测试脚本一个示例测试文件
tests/example.test.ts”
AI会输出完整的配置文件,你只需复制粘贴。
第2步:让AI为纯函数生成单元测试
假设你有一个合成规则函数:
// core/MergeRule.ts
export function canMerge(itemA: Item, itemB: Item): boolean {
return itemA.type === itemB.type && itemA.level === itemB.level;
}
提示词(测试生成):
“为以下函数生成完整的Vitest单元测试用例:
正常情况:两个相同类型且相同等级的道具 → 返回true
不同类型 → false
不同等级 → false
边界情况:其中一个道具为null → 应抛出错误
使用describe/it结构,包含至少5个测试用例”
AI输出:
import { describe, it, expect } from 'vitest';
import { canMerge } from '../core/MergeRule';
describe('canMerge', () => {
it('should return true for same type and same level', () => {
const itemA = { type: 'weapon', level: 3, value: 10 };
const itemB = { type: 'weapon', level: 3, value: 15 };
expect(canMerge(itemA, itemB)).toBe(true);
});
it('should return false for different types', () => {
const itemA = { type: 'weapon', level: 3 };
const itemB = { type: 'armor', level: 3 };
expect(canMerge(itemA, itemB)).toBe(false);
});
it('should throw error when either item is null', () => {
const item = { type: 'weapon', level: 3 };
expect(() => canMerge(null as any, item)).toThrow();
expect(() => canMerge(item, null as any)).toThrow();
});
});
第3步:让AI生成状态机测试
你的游戏可能有idle → playing → paused → gameover这几种状态。
提示词:
“我有一个游戏状态机类
GameStateMachine,方法有start(),pause(),resume(),end()。请生成测试用例,覆盖:
合法状态转换
非法转换应抛出错误(比如在
gameover后调用pause())状态变更事件是否触发”
AI会生成包含每个转换路径的测试,确保状态机行为正确。
第4步:让AI自动生成边界和随机测试
提示词(边界测试):
“以下函数负责计算合成后的新道具等级:
function getMergedLevel(levelA: number, levelB: number): number,规则是level + 1,最高不超过10。请生成边界测试:最小值、最大值、超出范围、负数的处理。”
提示词(随机测试):
“道具掉落概率函数
getRandomDrop()按权重返回道具类型。请生成测试,运行1000次,用卡方检验验证分布是否与权重一致。输出测试代码。”
四、案例:为合成游戏写完整测试
测试套件目录结构
tests/
├── unit/
│ ├── MergeRule.test.ts
│ ├── ScoreCalculator.test.ts
│ └── Inventory.test.ts
├── integration/
│ └── GameFlow.test.ts # 模拟完整对局
├── state/
│ └── GameStateMachine.test.ts
└── random/
└── DropDistribution.test.ts
集成测试示例(AI生成)
// tests/integration/GameFlow.test.ts
import { describe, it, expect, vi } from 'vitest';
import { GameCore } from '../../core/GameCore';
import { MockPlatformAdapter } from '../mocks/MockPlatformAdapter';
describe('GameFlow Integration', () => {
it('should complete a full game session without error', () => {
const mockAdapter = new MockPlatformAdapter(); // AI生成模拟适配器
const game = new GameCore(mockAdapter);
game.start();
game.dropItem({ type: 'sword', level: 1 });
game.dropItem({ type: 'sword', level: 1 });
game.merge(0, 1);
expect(game.getScore()).toBeGreaterThan(0);
expect(mockAdapter.storage.set).toHaveBeenCalledWith('lastScore', expect.any(Number));
});
});
五、CI集成:让每次提交自动跑测试
让AI生成GitHub Actions或GitLab CI配置:
提示词:
“为TypeScript小游戏项目生成
.github/workflows/test.yml,要求:
在push到main和pull_request时触发
安装Node.js,pnpm
运行
pnpm test(Vitest)测试失败则阻止合并”
AI会输出完整YAML配置。
六、3个常见坑与解法
⚠️ 坑1:测试覆盖了函数,但没覆盖异步操作
问题:适配器的storage.set是异步的,测试中没await,断言跑了但写入还没完成。
解法:让AI生成测试时自动添加async/await,或用vi.useFakeTimers()模拟时间。
⚠️ 坑2:随机函数导致测试不稳定
问题:Math.random()让测试每次结果不同。
解法:在测试中注入确定性随机种子——让AI生成一个DeterministicRandom类替换真实随机器。
⚠️ 坑3:AI生成的测试断言太弱
问题:只测“不报错”,不测“返回值正确”。
解法:在提示词中明确要求“为每个用例添加具体的expect断言,检查返回值、状态变更、副作用调用次数”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)