【Hermes系列8】Hermes 生成的测试代码能直接用吗?我 Review 了 10 个脚本(附真实评测数据)

0 阅读11分钟

【Hermes系列8】Hermes 生成的测试代码能直接用吗?我 Review 了 10 个脚本(附真实评测数据)

Hermes 生成的代码,我打了 71 分(附 Review 清单)| AI 测试代码质量评估:20% 可直接用,40% 需修改,40% 要重写

这是 Hermes 系列的第 8 篇,也是深度分析篇

前 7 篇我们解决了:是什么、怎么用、实战场景、CI 集成。但还有一个灵魂问题:

Hermes 生成的测试代码,质量到底怎么样?能直接用吗?需要人工 Review 吗?

作为一个测试老兵,我搭建了一个真实的电商演示系统,让 Hermes 生成了 10 个测试脚本,用专业测试的视角逐一评审。

今天这篇,我把评估结果完整分享给你。

包括:

  • 评估维度(5 个核心指标)
  • 评分结果(平均分 70.9/100)
  • 典型问题(4 大类 90 个小项)
  • 改进建议(如何让 Hermes 生成更好的代码)
  • Review Checklist(可直接用)
    真实评测数据(源码开源)

我承诺一个结果:你照着本文的 Checklist 走,10 分钟内能评估任何 Hermes 生成的测试代码


02

评估背景

为什么做这个评估?

Hermes 系列发布后,后台收到最多的问题是:

"周周,Hermes 生成的代码我不敢直接用,怎么判断质量?"
"AI 写的测试脚本,需要人工 Review 吗?Review 什么?"
"有没有一个清单,能帮我快速评估代码质量?"

作为测试我深知:代码质量决定维护成本

一个写得不好的测试脚本,短期能跑,长期是债。

所以我做了这个评估——给 Hermes 生成的代码一次系统性体检。

10 个脚本的来源

来源数量说明
本次实测生成10 个针对演示电商系统生成
测试场景覆盖10 个登录 (3)、仪表盘 (1)、商品 (3)、订单 (2)、退出 (1)

演示系统:Flask 电商系统(用户登录、商品管理、订单管理)

评估时间:2026-04-15(实测)

评估方法

  1. 静态代码分析(不运行,看代码)
  2. 动态执行验证(运行,看结果)
  3. 自动化评审脚本(Python + Review Checklist)

03

评估维度

我定义了 5 个核心维度,每个维度 20 分,总分 100 分:

维度权重评估内容
代码可读性20%命名、注释、结构、一致性
定位器稳定性30%ID 优先、XPath 慎用、等待策略
断言覆盖率25%关键检查点、边界验证、错误处理
异常处理15%超时、重试、截图、日志
可维护性10%模块化、可复用、配置分离

为什么这样权重?

定位器稳定性 (30%) + 断言覆盖率 (25%) = 55%

这是测试脚本的核心价值:
- 定位器不稳 → 脚本 flaky(时过不过)
- 断言不全 → 测了等于没测

可读性和异常处理可以后期优化,但核心质量必须一开始就过关。

04

评估结果

总体评分

指标数值
平均分70.9/100
最高分87/100
最低分50/100
中位数71/100

分级统计

等级分数范围数量占比说明
A(可直接用)85-1002 个20%无需修改或仅需微调
B(需小幅修改)70-844 个40%修改后可用
C(需大幅重写)50-694 个40%核心逻辑需重写
D(不可用)<500 个0%

结论

- 20% 可直接用 → Hermes 能胜任简单场景
- 40% 需小幅修改 → 主流情况,人工 Review 有价值
- 40% 需大幅重写 → 复杂场景仍需测试专家介入

Hermes 的定位:快速生成初版,减少重复劳动
不是:完全替代人工测试工程师

📊 评测详情

脚本得分等级问题数
04-test_dashboard_load.py87A5
08-test_create_order.py85A6
01-test_login_success.py75B8
06-test_add_product.py75B8
09-test_create_order_insufficient_stock.py72B9
10-test_logout.py70B9
02-test_login_wrong_password.py65C11
03-test_login_empty_username.py65C11
05-test_products_page_load.py65C11
07-test_delete_product.py50C12

05

各维度得分详情

维度 1:代码可读性(平均分 76/100)

子项平均分典型问题
变量命名80/100部分用 a/b/c 等无意义命名
函数注释75/100有注释但不够详细
代码结构78/100大部分结构清晰
一致性72/100命名风格不统一(camelCase vs snake_case)

好例子

# ✅ 好的命名
def login_with_valid_credentials():
    """使用有效凭据登录系统"""
    username = "admin"
    password = "123456"
    login_page.enter_username(username)
    login_page.enter_password(password)
    login_page.click_login_button()

坏例子

# ❌ 坏的命名
def test1():
    a = "admin"
    b = "123456"
    page.fill("#username", a)
    page.fill("#password", b)
    page.click("#login-btn")

维度 2:定位器稳定性(平均分 68/100)⭐ 最弱项

子项平均分典型问题
ID 优先75/100部分未用 ID
XPath 慎用55/100XPath 使用过多
等待策略65/100缺少显式等待
选择器可读性78/100大部分选择器可读性好

典型问题

# ❌ 问题 1:XPath 写死(页面一变就挂)
page.click("/html/body/div[1]/div[2]/div[3]/button[2]")

# ✅ 改进:用 ID 或 role
page.click("#submit-btn")
page.get_by_role("button", name="提交").click()
# ❌ 问题 2:缺少等待(竞态条件)
page.click("#login-btn")
assert page.url == "/home"  # 可能页面还没跳转

# ✅ 改进:显式等待
page.click("#login-btn")
page.wait_for_url("/home", timeout=5000)
assert page.url == "/home"
# ❌问题 3:CSS 选择器过于复杂
page.click(".container > div:nth-child(3) > form > input:nth-child(2)")

# ✅ 改进:简化选择器
page.click("#username")

维度 3:断言覆盖率(平均分 71/100)

子项平均分典型问题
关键检查点75/100部分缺少关键断言
边界验证60/100边界场景覆盖不足
错误消息验证68/100错误消息未验证
状态验证78/100大部分有状态验证

典型问题

# ❌ 问题 1:只验证成功,不验证失败
def test_login():
    page.fill("#username", "admin")
    page.fill("#password", "123456")
    page.click("#login-btn")
    assert page.url == "/home"  # 只验证成功场景

# ✅ 改进:覆盖失败场景
def test_login_success():
    # 成功场景
    ...

def test_login_wrong_password():
    # 失败场景:密码错误
    page.fill("#username", "admin")
    page.fill("#password", "wrong")
    page.click("#login-btn")
    assert "密码错误" in page.text_content(".error-message")
# ❌ 问题 2:断言太弱
assert page.url  # 只检查 URL,没检查内容

# ✅ 改进:多重断言
assert page.url == "/home"
assert "欢迎" in page.text_content("h1")
assert user_info.is_visible()

维度 4:异常处理(平均分 74/100)

子项平均分典型问题
超时处理70/100部分缺少超时设置
重试机制65/100重试逻辑不足
截图保存80/100大部分有截图
日志记录75/100日志详细度中等

典型问题

# ❌ 问题 1:没有超时设置
page.click("#submit-btn")  # 如果按钮加载慢,可能卡死

# ✅ 改进:设置超时
page.click("#submit-btn", timeout=10000)
# ❌ 问题 2:失败时没有截图
try:
    assert page.url == "/home"
except AssertionError:
    pass  # 失败时什么都不做

# ✅ 改进:失败时截图
try:
    assert page.url == "/home"
except AssertionError:
    page.screenshot(path="screenshots/login_failed.png")
    raise

维度 5:可维护性(平均分 78/100)

子项平均分典型问题
模块化75/100部分代码未拆分函数
可复用性72/100重复代码较多
配置分离85/100大部分配置已分离
数据驱动70/100测试数据硬编码较多

典型问题

# ❌ 问题 1:测试数据硬编码
def test_login():
    page.fill("#username", "admin")
    page.fill("#password", "123456")

# ✅ 改进:配置分离
TEST_ACCOUNTS = {
    "admin": {"username": "admin", "password": "***"},
    "user": {"username": "testuser", "password": "***"}
}

def test_login(account_type="admin"):
    account = TEST_ACCOUNTS[account_type]
    page.fill("#username", account["username"])
    page.fill("#password", account["password"])
# ❌ 问题 2:重复代码
def test_login_success():
    page.goto("http://localhost:5000/login")
    page.fill("#username", "admin")
    page.fill("#password", "123456")
    page.click("#login-btn")

def test_login_wrong_password():
    page.goto("http://localhost:5000/login")
    page.fill("#username", "admin")
    page.fill("#password", "wrong")
    page.click("#login-btn")

# ✅ 改进:抽取公共方法
def navigate_to_login():
    page.goto("http://localhost:5000/login")

def login(username, password):
    page.fill("#username", username)
    page.fill("#password", password)
    page.click("#login-btn")

06

问题分类统计

问题分布

类别问题数占比典型问题
代码结构5561%缺少文档字符串、URL 硬编码、测试数据硬编码
异常处理2831%缺少超时设置、没有异常捕获、失败时没有截图
断言问题67%只有一个断言、缺少 URL 验证
定位器问题11%使用硬编码索引 (nth-child)

💡 关键发现

1. 代码结构问题最多(61%)→ 主要是缺少文档和配置分离
2. 异常处理普遍不足(31%)→ AI 倾向于生成"快乐路径"代码
3. 定位器问题较少(1%)→ Hermes 默认使用 ID 选择器,表现良好

07

关键发现与洞察

基于本次评测的 10 个脚本和 90 个问题项,我有 3 个核心洞察:

洞察 1:Hermes 擅长"形",不擅长"神"

TEXT

"形" → 代码结构、选择器使用、基本流程(得分 80+)
"神" → 异常处理、边界思考、质量意识(得分 30-40

这很合理。AI 学习的是代码的"表象",但测试的"灵魂"是质疑和防御思维。

洞察 2:AI 生成的代码,像初级测试工程师写的

共同特点:
- 能跑通"快乐路径"(Happy Path)
- 缺少异常场景思考
- 不会主动加文档和注释
- 需要 Code Review 指导

这不是问题,而是定位。Hermes 的价值是帮你快速生成初版,然后你来当 Reviewer。

洞察 3:Prompt 质量决定代码质量的上限

同样的登录场景,我做了对比实验:

Prompt得分差异
"写一个登录测试"65 分基础版本
"写一个登录测试,要求添加异常处理和截图"78 分+13 分
详细需求 + 示例代码85 分+20 分

你给 Hermes 的上下文越详细,它生成的代码越接近你的期望。


08

下篇预告

这篇文章只讲了"评测结果",但更重要的是"如何改进"。

下篇《Hermes 生成代码质量提升指南:从 70 分到 90 分的 5 个技巧》我会讲

✅ 改进实战 1:如何补充异常处理(50 分 → 85 分)
✅ 改进实战 2:如何优化等待策略(消除固定等待)
✅ 改进实战 3:如何强化断言(从 1 个到 5 个)
✅ Prompt 技巧:4 个让 Hermes 生成更好代码的方法
✅ 迭代优化:如何让 Hermes 逐步改进代码
✅ Review 工具:自动化评审脚本使用说明

预计发布时间:明天(关注公众号,不错过更新)

源码获取:私信

09

结论与建议

Hermes 的定位

✅ 适合:
- 快速生成测试脚本初版
- 减少重复劳动(如 CRUD 测试)
- 标准化场景(登录、查询、列表)
- 测试数据准备

❌ 不适合:
- 完全替代人工测试工程师
- 复杂业务逻辑测试
- 高可靠性要求的场景(如金融、医疗)
- 需要深度领域知识的场景

我的建议
1. 用 Hermes 生成初版(节省 70% 时间)
2. 人工 Review 和优化(花 30% 时间保证质量)
3. 建立团队规范(Review Checklist)
4. 持续迭代(根据反馈优化提示词)

ROI 计算

传统方式:
- 写一个测试脚本:30 分钟
- 10 个脚本:300 分钟(5 小时)

Hermes + Review:
- 生成初版:5 分钟
- Review + 优化:10 分钟
- 10 个脚本:150 分钟(2.5 小时)

效率提升:50%
质量:可控(有 Review)

11

谢谢你看到这里。

这篇可能是系列里最硬核的一篇——用 10 个脚本换你一个清晰的判断框架。

Hermes 生成的代码,71 分,及格以上,优秀未满。

但这正是 AI 工具的正确打开方式

AI 生成初版(70 分)+ 人工 Review 优化(+20 分)= 90 分高质量代码

不是让 AI 替代你
而是让 AI 放大你的价值

留言告诉我:

  • 你用 Hermes 生成过代码吗?质量如何?
  • 你最关心代码的哪个方面?
  • 你有自己的 Review 清单吗?

每一条留言,我都会看,都会回。


AI 生成的代码,71 分;人工 Review 的价值,29 分;合起来才是 100 分。


P.S. 如果你不想错过更新,记得点个在看或者分享到朋友圈。

P.P.S. Hermes 系列共 15 篇,这是第 8 篇。建议收藏,方便后续查阅。


(全文约 6500 字,阅读时间约 18 分钟)


动手试试

读完这篇文章,你可以:

  1. 用 Review Checklist 评估你生成的测试代码
  2. 根据问题项,让 Hermes 迭代优化
  3. 下载源码,复现本次评测
  4. 在留言区分享:你给 Hermes 代码打几分?

别等完美,先跑起来。迭代,是通往优秀的唯一路径。

作者:测试员周周,14 年测试经验,专注 AI+ 测试实战