📌 摘要

很多开发者用AI生成游戏代码后,测试方式依然是:自己玩两局,觉得没问题就发布。结果用户遇到边界条件(比如同时合成10个道具、网络断线重连、分数溢出),直接闪退。

AI不仅能写代码,还能帮你写测试代码。本文教你一套提示词方法,让AI基于你的游戏逻辑自动生成单元测试、集成测试、边界测试。配合TypeScript的类型系统和Jest/Vitest,实现高覆盖率自动化测试流水线。


一、为什么小游戏需要自动化测试?

痛点 手动测试 自动化测试
回归Bug 改一行代码,测一遍全流程,耗时1小时 10秒跑完所有用例
边界条件 很难想到“99级升100级经验溢出”这类场景 AI自动生成边界值测试
平台差异 微信/抖音/H5分别测,重复劳动 同一套测试逻辑,不同适配器跑
修改信心 不敢重构,怕崩 测试全绿,大胆优化

👉 一套好的自动化测试 = 代码修改的“安全网” + 发布前的“守门员”


二、AI能帮你测试什么?

测试类型 说明 AI能做什么
单元测试 测试单个函数/类 根据函数签名自动生成用例(正常值、边界值、异常值)
集成测试 测试模块间交互 模拟游戏核心逻辑 + 适配器交互
状态机测试 测试游戏状态流转 自动生成状态转换图,并测试非法转换被拒绝
随机事件测试 测试概率/随机算法 多次运行,统计分布是否符合预期
性能测试 测试帧率/内存 AI生成大量操作序列,测量耗时

三、实战:用AI生成测试套件

第1步:配置测试框架(让AI帮你写配置)

提示词:

“我的项目是TypeScript小游戏,使用Vitest作为测试框架。请生成:

  1. vitest.config.ts 配置文件

  2. package.json 中的测试脚本

  3. 一个示例测试文件 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()。请生成测试用例,覆盖:

  1. 合法状态转换

  2. 非法转换应抛出错误(比如在gameover后调用pause()

  3. 状态变更事件是否触发”

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断言,检查返回值、状态变更、副作用调用次数”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐