activity-ai-test-generator
SKILL.md
Activity AI Test Generator
为 WesPy-HTTP-Go 活动自动生成基于 acttest.AiTest 框架的 AI 自动化测试文件。
用户调用方式
/activity-ai-test-generator activity=jk_wilderness_enforcers act_id=6534
/activity-ai-test-generator activity=in_limited_lies act_id=6204 module=hook
/activity-ai-test-generator activity=jk_riyadh_city_race act_id=6500 module=all
参数说明
activity: 必需 - 活动目录名称(如jk_wilderness_enforcers、in_limited_lies)act_id: 必需 - 活动ID(如6534、6204)module: 可选 - 指定生成的模块(默认all)route- 只生成接口测试event- 只生成事件测试hook- 只生成钩子测试service- 只生成 service 层测试all- 生成所有模块测试
核心功能
-
自动扫描活动目录结构
- 扫描
internal/route/下的所有接口处理函数 - 扫描
internal/event/下的所有事件处理函数 - 扫描
internal/hook/下的所有钩子结构体和方法 - 扫描
internal/service/下的核心业务逻辑函数
- 扫描
-
智能提取测试目标
- 识别 HTTP 路由处理函数(参数包含
*gin.Context) - 识别事件处理函数(参数包含
string或事件结构体) - 识别钩子接口实现(如
TaskHooker、BlindBoxHook、ExtraGiftHook) - 识别核心业务逻辑函数(公开导出的业务方法)
- 识别 HTTP 路由处理函数(参数包含
-
生成精准的测试文件
- 包名:使用
<package_name>_test避免循环依赖 - init 函数:自动设置正确的区域(RegionMiddleEastJackaroo、RegionIndia 等)
- 测试函数:为每个目标方法生成对应的
TestXxx函数 - 提示词:为每个测试编写精准的场景描述和参数构造指导
- 包名:使用
生成的测试文件结构
1. 接口测试文件(route_test.go 或 <activity>_test.go)
package <activity>_test
import (
"context"
"testing"
"wespy-http-go/app/activity/<year>/<region>/<activity>/internal/conf"
"wespy-http-go/app/activity/<year>/<region>/<activity>/internal/service"
"wespy-http-go/app/activity/common/acttest"
"wespy-http-go/app/bootutil"
"wespy-http-go/pkg/weconfig"
)
func init() {
bootutil.ActLocalTest.SetRegion(weconfig.Region<Region>).AddRedis("user").Init()
}
func TestDoLottery(t *testing.T) {
acttest.AiTest(
conf.ActId,
"这是一个抽奖接口,用户消耗能量碎片进行抽奖...",
service.DoLottery,
map[string]interface{}{
"arg0": context.Background(),
},
)
}
2. 事件测试文件(event_test.go)
func TestHandleSendGift(t *testing.T) {
acttest.AiTest(
conf.ActId,
"这是送礼事件处理函数...",
event.HandleSendGift,
nil,
)
}
3. 钩子测试文件(hook_test.go)
func TestTaskHooker_BeforeSendReward(t *testing.T) {
h := &hook.TaskHooker{}
acttest.AiTest(
conf.ActId,
"这是发奖前的钩子...",
h.BeforeSendReward,
nil,
)
}
提示词生成规则
每个测试函数的提示词(playPromote)必须包含以下内容:
- 功能描述:简要说明这是什么类型的接口/事件/钩子
- 业务逻辑:核心业务流程(如"抽奖后会自动触发能量值累积任务")
- 测试账号:建议的测试 UID 统一使用 1(用户可根据需要自行修改)
- 配置依赖:提示从活动动态配置 JSON 中提取参数(如"请结合 LotteryConfig 配置...")
- 参数说明:简要说明各参数的含义
示例:
"这是一个抽奖接口,用户消耗能量碎片进行抽奖,抽奖后会自动触发能量值累积任务,并检查是否获得大奖(大奖获得者会加入荣耀殿堂并通知其他抽奖用户)。" +
"测试 uid 建议使用 1。" +
"请结合活动动态配置 JSON 中的 LotteryConfig 配置(包含 BigReward、ReplaceReward、ReceiveLimit、LotteryCumTask、LikeLotteryType 等字段)和抽奖池配置进行参数构造,切勿盲猜抽奖类型。" +
"参数说明:ctx 是上下文,lotteryReq 包含 ActId、Uid、Number(抽奖次数)、AutoPurchase(自动购买)等字段。"
区域映射表
根据活动路径自动选择正确的区域常量:
| 路径前缀 | 区域常量 |
|---|---|
jk/ |
weconfig.RegionMiddleEastJackaroo |
in/ |
weconfig.RegionIndia |
us/ |
weconfig.RegionUsa |
jp/ |
weconfig.RegionJapan |
kr/ |
weconfig.RegionKorean |
测试 UID:所有测试统一建议使用 1,用户可根据实际需要自行修改。
执行流程
-
参数验证
- 检查
activity和act_id参数是否提供 - 检查活动目录是否存在(
app/activity/<year>/<region>/<activity>)
- 检查
-
扫描活动目录
- 使用 Glob 查找
internal/route/*.go、internal/event/*.go、internal/hook/*.go、internal/service/*.go - 读取源文件,提取公开导出的函数和方法
- 使用 Glob 查找
-
提取测试目标
- 接口:查找以
func (c *gin.Context)开头的函数 - 事件:查找
func Handle*或func *Event函数 - 钩子:查找实现钩子接口的结构体(
type *Hook struct)及其方法 - Service:查找公开导出的业务逻辑函数(首字母大写)
- 接口:查找以
-
生成测试文件
- 根据
module参数决定生成哪些测试文件 - 自动设置包名、导入、init 函数
- 为每个目标方法生成对应的测试函数
- 编写精准的提示词
- 根据
-
编译验证
- 使用
go test -c验证生成的测试文件语法正确 - 输出生成的测试文件路径和统计信息
- 使用
示例输出
✅ 成功生成 AI 自动化测试文件
📁 活动目录: app/activity/2026/jk/jk_wilderness_enforcers
📊 统计信息:
- 接口测试: 4 个 (DoLottery, GetTaskInfo, GetNewHonorRank, Like)
- 钩子测试: 2 个 (AfterQueryTaskInfo, BeforeSendReward)
- 总计: 6 个测试函数
📄 生成的文件:
- lottery_test.go (101 行)
✅ 编译验证通过
注意事项
- 避免循环依赖:测试文件包名必须使用
<package>_test - 区域设置准确:根据活动路径自动选择正确的区域常量
- 配置 ID 准确:使用活动配置中的常量(如
conf.ActId)而非硬编码 - 提示词精准:必须包含配置字段提示,避免 AI 盲猜参数
- context.Background():对于首参数是
context.Context的方法,必须在fixedParams中传入
现在开始根据用户提供的参数生成 AI 自动化测试文件。