2026年从规则到测试:构建你的 AI 测试 Harness

从规则到测试:构建你的 AI 测试 Harness让 AI 理解你的业务逻辑 自动生成高质量单元测试 在软件工程的演进中 测试始终是保障质量的基石 但写测试用例 尤其是覆盖边界条件和复杂业务规则的用例 往往枯燥 耗时 且容易遗漏关键路径 有没有可能 让 AI 帮你读懂代码中的业务规则 并自动生成精准的测试用例 答案是 可以 而关键在于 如何将 隐式 的业务逻辑 转化为 AI 能理解的 显式 结构化规则 本文将带你从零构建一个

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



让 AI 理解你的业务逻辑,自动生成高质量单元测试

在软件工程的演进中,测试始终是保障质量的基石。但写测试用例——尤其是覆盖边界条件和复杂业务规则的用例——往往枯燥、耗时,且容易遗漏关键路径。

有没有可能,让 AI 帮你读懂代码中的业务规则,并自动生成精准的测试用例

答案是:可以! 而关键在于:如何将“隐式”的业务逻辑,转化为 AI 能理解的“显式”结构化规则

本文将带你从零构建一个 AI 测试 Harness(测试夹具),实现 “规则提取 → LLM 理解 → 测试生成” 的完整闭环。

你可能试过让 LLM(如 GPT、Claude、Ollama)为函数写单元测试:

go编辑

func NeedCaptcha(phone string) bool

member, _ := repo.GetByPhone(phone) if member != nil && member.IsVIP { return false } return true 

}

但 AI 给出的测试往往是:

  • 只覆盖 phone == "" 和普通手机号
  • 忽略“查询失败视为新用户”的隐藏规则
  • 不知道 IsVIP 是关键判断条件

原因很简单:AI 看不懂“注释”和“意图”,它只能看到代码表面。

而业务规则,往往藏在:

  • if 条件组合中
  • 错误处理分支里
  • 依赖调用的返回值语义中

我们要做的,是把函数中的 控制流逻辑 转化为 结构化的规则列表,例如:

json编辑

{ "name": "NeedCaptcha", "rules": [

{ "condition": "phone == """, "action": "true", "calls": [] }, { "condition": "err != nil", "action": "true", "calls": ["repo.GetByPhone(...)"] }, { "condition": "member != null && member.IsVIP", "action": "false", "calls": ["repo.GetByPhone(...)"] }, { "condition": "default (unconditional)", "action": "true", "calls": ["repo.GetByPhone(...)"] } 

] }

这个 JSON 就是 AI 的“说明书” ——它清晰地告诉 LLM:

“当手机号为空时,返回 true;当数据库查询失败时,也返回 true;只有 VIP 用户才返回 false……”

我们使用 Go 的标准库 go/ast 编写一个轻量级提取器:https://github.com/shemiouwang-lgtm/go-ast-rule-extractor

bash编辑

# 安装后,一行命令提取规则 go run rule-extractor.go –file user_service.go –func NeedCaptcha –json 

输出即为上述结构化 JSON。

核心能力:

  • ✅ 解析 if / else if / return 分支
  • ✅ 还原条件表达式(支持 &&||、索引、类型断言等)
  • ✅ 记录每个分支涉及的外部调用(如 repo.GetByPhone
  • ✅ 输出标准 JSON,可直接喂给 LLM

💡 提示:该工具无第三方依赖,纯标准库实现,可集成到 CI/CD 中。

有了结构化规则,我们就可以构造 LLM Prompt:

text编辑

你是一个资深 Go 测试工程师。请为以下函数生成 100% 分支覆盖的单元测试。

函数名:NeedCaptcha 业务规则: [ {"condition": "phone == """, "action": "true"}, {"condition": "err != nil", "action": "true"}, {"condition": "member != null && member.IsVIP", "action": "false"}, {"condition": "default", "action": "true"} ]

要求:

  1. 使用 testify/mock
  2. 每个规则对应一个 test case
  3. 测试用例命名清晰(如 TestNeedCaptcha_EmptyPhone_ReturnsTrue)
  4. 覆盖所有边界条件

    AI 输出示例(Ollama + CodeLlama):

    go编辑

    func TestNeedCaptcha_EmptyPhone_ReturnsTrue(t *testing.T) { s := &UserService{} assert.True(t, s.NeedCaptcha("")) }

func TestNeedCaptcha_RepoError_ReturnsTrue(t *testing.T) {

mockRepo := new(MockMemberRepo) mockRepo.On("GetByPhone", "").Return(nil, errors.New("db error")) s := &UserService{memberRepo: mockRepo} assert.True(t, s.NeedCaptcha("")) 

}

func TestNeedCaptcha_VIPUser_ReturnsFalse(t *testing.T) {

mockRepo := new(MockMemberRepo) mockRepo.On("GetByPhone", "").Return(&Member{IsVIP: true}, nil) s := &UserService{memberRepo: mockRepo} assert.False(t, s.NeedCaptcha("")) 

}

精准覆盖所有规则命名规范,可读性强自动 mock 依赖

将上述流程封装为一个 AI 测试 Harness

文本编辑

[源代码] ↓ (AST 规则提取) [结构化规则 JSON] ↓ (LLM Prompt) [AI 生成的测试代码] ↓ (静态检查 + 执行) [测试报告 + 覆盖率] 

可扩展方向:

表格

更重要的是:你把“业务规则”从代码中显式提炼出来,形成了可追溯、可验证的知识资产

小讯
上一篇 2026-04-16 14:19
下一篇 2026-04-16 14:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/262502.html