Argus登上Hacker News:Cursor、Claude Code疯狂写代码后,测试团队反而成了新瓶颈?

简介: AI编码提速后,测试成为新瓶颈。开源项目Argus提出“Agentic QA”:用多智能体(理解、探索、规划、执行、验证)替代人工脚本,实现意图驱动的自动化测试。它不取代确定性验证,而是协同Playwright等工具,构建“确定性脚本+概率性Agent+AI评估”的新一代测试体系。

这两年程序员第一次碰到了一个有点反常的问题:

代码写得太快了。

以前一个需求可能是:

产品评审半天。

开发3天。

测试2天。

修Bug一天。

上线。

现在有了Cursor、Claude Code、Codex之后,有些中小需求真的可能变成:

产品需求刚下来。

开发把Prompt扔进去。

Agent读代码。

Agent改代码。

Agent补接口。

Agent写SQL。

Agent提交PR。

半小时以后,开发转头问测试:

“好了,可以测了。”

测试工程师:

???

昨天三个需求还没测完,今天又来了五个。

这就是AI Coding越来越普及以后,一个很容易被忽视的问题:

开发速度提高,不等于整个软件交付速度同比提高。

如果代码生成速度提高5倍,而验证速度只提高20%,最后新的瓶颈反而会出现在:

QA。
也正是在这个背景下,一个叫 Argus 的开源项目最近登上了Hacker News。

它打出的定位非常直接:

Agentic QA for teams whose coding agents move faster than QA.

翻译成人话就是:

既然写代码的已经是Agent了,那为什么测试代码还必须靠人一条一条写?

这件事情,可能比“AI帮我生成测试用例”要重要得多。

一、Argus到底干了什么?
先别把它想得太复杂。

传统UI自动化通常是:

测试工程师

设计测试场景

写Playwright/Selenium脚本

维护Selector

运行脚本

看报告
Argus想做的事情变成了:

测试目标

AI理解我要测什么

自己探索页面

自己规划测试步骤

调用Playwright操作浏览器

动态判断页面结果

输出报告、截图、执行时间线
Argus官方把一次测试拆成了五个Agent。

Validator

先检查你的URL和测试目标是不是可执行的。

Comprehender

把一句自然语言需求拆成测试场景。

Explorer

先去页面里探索:

有什么页面?

有什么按钮?

可以做什么操作?

Strategist

根据页面地图和测试目标规划执行步骤。

最后是:

Executor

真正打开Playwright浏览器,点击、输入、滚动、检查结果。

所以它真正值得测试工程师研究的,并不是:

“又来了一个AI自动化工具。”

而是:

测试自动化正在出现另外一种组织方式。

过去:

Script Driven Testing。

现在开始出现:

Agent Driven Testing。

二、但这里有一个非常容易被吹过头的地方
很多文章会直接得出结论:

XPath没用了。

Playwright不用学了。

自动化脚本要消失了。

我觉得都说早了。

因为Agentic QA不是把确定性测试扔掉。

真正合理的架构其实是:

AI负责理解
+
AI负责规划
+
自动化工具负责执行
+
确定性程序负责验证
这句话特别重要。

因为:

LLM适合推理。

但:

测试Oracle最好尽可能确定。

什么叫Oracle?

简单说就是:

你凭什么判断这个测试到底通过了?

这恰恰是很多初级测试工程师天天在做,但面试的时候又很容易讲浅的地方。

我们从一个最简单的真实案例讲起。

三、案例一:为什么你的UI自动化总是“昨天能跑,今天挂了”?
假设你负责一个商城。

最普通的登录自动化:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
browser = p.chromium.launch()

page = browser.new_page()

page.goto("https://test.example.com/login")

page.locator("#username").fill("tester")

page.locator("#password").fill("123456")

page.locator("#login-btn").click()

page.wait_for_url("**/home")

assert page.locator(
    ".welcome"
).inner_text() == "欢迎回来"

browser.close()

跑了两个月。

突然有一天CI红了。

TimeoutError:
locator("#login-btn")
not found
你打开网站。

登录功能根本没坏。

只是前端重构以后:


变成:


于是:

业务没有变。

自动化挂了。

四、面试官问:为什么UI自动化维护成本高?
很多初级工程师回答:

因为元素容易变化。

对。

但如果只回答到这里,最多算60分。

真正更深的问题是:

我们把“业务意图”和“页面实现”绑定得太紧了。
测试真正想表达的是:

输入用户名
输入密码
点击登录
验证登录成功
但是脚本表达的是:

page.locator(
"#app > div:nth-child(2) > form > button"
).click()
前者是什么?

业务语义。

后者是什么?

实现细节。

于是页面实现只要调整:

测试资产跟着坏。

这才是传统UI自动化一直被Flaky Test困扰的重要原因之一。

五、Playwright其实已经往前走了一步
所以为什么现在越来越多自动化工程师喜欢:

page.get_by_role(
"button",
name="登录"
).click()
而不是:

page.locator(
"//*[@id='root']/div/div[2]/button"
).click()
因为前者更接近:

用户看到的东西。

而不是:

DOM具体怎么实现。

这就是一个非常值得记住的变化:

结构定位

语义定位

意图驱动
而Argus这类Agentic QA,实际上是在继续往下一层走:

测试人员甚至不告诉它:

get_by_role("button", name="登录")
只告诉它:

验证正常用户是否可以成功登录商城。

剩下的页面理解和操作规划让Agent完成。

六、一个最小的Agentic QA到底长什么样?
我们甚至不需要上来就搭一个复杂Agent框架。

先把测试目标变成结构化描述:

test_task = {
"goal": "验证正常用户是否能够成功登录商城",
"user": {
"username": "tester",
"password": "123456"
},
"expected": [
"登录成功",
"进入用户首页",
"页面展示当前用户名"
]
}
然后让LLM负责:

理解测试目标

观察页面

产生Action
例如:

{
"action": "click",
"target": {
"role": "button",
"name": "登录"
}
}
最终仍然可以交给Playwright执行:

def execute_action(page, action):

if action["action"] == "click":

    target = action["target"]

    page.get_by_role(
        target["role"],
        name=target["name"]
    ).click()

注意这个结构。

LLM没有直接控制Chrome。

而是:

LLM

Structured Action

Browser Tool

Playwright

Browser
这实际上就是Agent工程里非常重要的一条原则:

不要让模型直接干所有事情。
尽量让模型:

决策。

让Tool:

执行。

七、但是问题来了:Agent说“登录成功”,你信吗?
这是我特别建议拿去做面试题的一句话。

假设Agent完成操作以后告诉你:

测试通过。

用户成功登录商城。
你敢直接把CI标绿吗?

当然不能。

因为:

Agent自己的结论不能直接等于测试结果。
这也是Agentic QA最容易被初学者忽略的问题。

八、我们需要一个Evaluator
比如登录成功,不要问LLM:

“你觉得是不是成功了?”

可以直接验证三个事实。

第一:

URL。

assert "/home" in page.url
第二:

登录态。

cookies = page.context.cookies()

token_exists = any(
cookie["name"] == "access_token"
for cookie in cookies
)

assert token_exists
第三:

页面状态。

expect(
page.get_by_text("tester")
).to_be_visible()
于是整个系统变成:

Planner Agent

Executor

Browser

Evaluator
这里真正发生了一件非常重要的事情:

Agent可以是概率性的。

但是:

核心业务结果尽量使用确定性验证。

九、“测试从确定性脚本走向概率性推理”,到底是什么意思?
这句话最近很火。

但是特别容易被误解。

传统自动化:

click("#login")

fill("#username")

assert url == "/home"
只要环境不变:

执行路径就是固定的。

这种东西叫:

Deterministic。

Agentic QA不一样。

同样一句:

测试一下登录功能。

第一次Agent可能:

先看登录按钮。

第二次可能:

先分析表单。

第三次:

可能尝试注册入口以后再返回登录。

它的执行路径:

并不一定完全一致。

这就是概率性推理。

所以Agentic QA真正难的不是:

能不能点页面。

真正难的是:

每次走的路都可能不同,怎么证明最终质量是稳定的?

这就把测试行业带到了一个新的问题:

我们开始需要测试“测试Agent”。
十、怎么测试一个Agent?
假设我们让Argus类Agent执行:

验证用户可以正常登录
不要只跑一次。

跑100次。

记录:

results = {
"total": 100,
"success": 87,
"failed": 13
}

success_rate = (
results["success"]
/ results["total"]
)

print(success_rate)
结果:

87%
现在问题来了。

传统自动化:

通过
失败
Agent测试开始出现:

成功率
继续。

为什么13次失败?

可能是:

5次页面定位错误

3次错误判断验证码状态

2次模型超时

2次错误规划

1次环境故障
测试工程师开始需要统计:

metrics = {
"task_success_rate": 0.87,
"avg_steps": 8.6,
"avg_latency": 14.2,
"avg_tokens": 3260,
"retry_rate": 0.18
}
这其实已经不是传统UI自动化的思维了。

这是:

Agent Evaluation。
十一、再看一个真正企业级的案例
前面登录的例子大家每天都能遇到。

接下来我们上一个难度。

假设现在测试的是:

电商退款。
需求:

用户购买商品后,在订单发货前申请退款,退款成功后订单关闭、支付原路退回、库存恢复、优惠券返还。

页面看起来只有一个按钮:

申请退款
但是背后的业务链路可能是:

退款申请

订单服务

支付服务

库存服务

优惠券服务

MQ

数据最终一致
这时候如果Argus只看到:

页面显示“退款成功”
它真的测完了吗?

没有。

甚至只完成了20%。

十二、这也是为什么“像用户一样测试”还不够
真正的企业QA必须同时回答:

页面状态对不对?

接口状态对不对?

数据库对不对?

支付流水对不对?

库存有没有回滚?

优惠券有没有恢复?

消息有没有重复消费?

这就是单纯Browser Agent和真正企业级Agentic QA之间的差距。

Argus当前公开项目主要聚焦视觉UI测试和真实Playwright浏览器环境;但其“理解目标—探索环境—规划—执行”的思路,可以继续向API、数据库、日志、消息队列等企业测试工具扩展。

十三、退款场景怎么设计Agentic QA?
可以拆成:

Test Planner

UI Agent

API Agent

DB Tool

MQ Tool

Evaluator
例如UI Agent负责:

page.get_by_role(
"button",
name="申请退款"
).click()

page.get_by_text(
"退款原因"
).click()

page.get_by_role(
"button",
name="提交"
).click()
然后API层验证:

import requests

def get_order(order_id):

response = requests.get(
    f"https://test-api.example.com/orders/{order_id}"
)

return response.json()

order = get_order("ORDER_10086")

assert order["status"] == "REFUNDED"
十四、然后查支付
def get_payment(order_id):

response = requests.get(
    "https://payment-test.example.com/query",
    params={"orderId": order_id}
)

return response.json()

payment = get_payment("ORDER_10086")

assert payment["refundStatus"] == "SUCCESS"
再查库存:

stock_before = 100

stock_after = query_stock(
sku_id="SKU_001"
)

assert stock_after == stock_before
优惠券:

coupon = query_coupon(
user_id="USER_001"
)

assert coupon["status"] == "AVAILABLE"
这时候你会发现:

真正可靠的Agentic QA,不是:

所有东西都让AI判断。
反而是:

AI负责协调越来越多确定性的验证工具。
十五、这里藏着一道特别经典的面试题:什么叫最终一致性?
假设退款成功后。

订单:

立即变成 REFUNDED
但是库存服务因为MQ异步消费:

3秒后才恢复。

你的测试代码:

assert query_stock("SKU_001") == 100
立即执行。

结果:

99
测试失败。

这是Bug吗?

不一定。

可能只是:

Eventually Consistent。

很多初级测试工程师遇到这种问题第一反应就是:

time.sleep(10)
这也是面试特别容易说不清楚的地方。

十六、为什么sleep(10)不是好方案?
因为:

如果1秒恢复:

浪费9秒。

如果11秒恢复:

还是失败。

正确思路应该是:

Poll + Timeout。

例如:

import time

def wait_until(
condition,
timeout=10,
interval=0.5
):

start = time.time()

while time.time() - start < timeout:

    if condition():
        return True

    time.sleep(interval)

return False

使用:

success = wait_until(
lambda:
query_stock("SKU_001") == 100,
timeout=10
)

assert success
这背后真正考的是:

同步等待和异步最终一致性的区别。
如果面试官问:

为什么不能直接sleep?

只回答:

“浪费时间。”

明显不够。

更完整的答案应该是:

sleep属于固定等待,既无法根据实际状态提前结束,也无法适应超出固定等待时间的异步延迟;对于最终一致性场景,更适合使用带超时的条件轮询。

这就是面试官真正想听的东西。

十七、Agent反而能让这件事情更聪明
假设Evaluator发现:

订单 = REFUNDED

支付 = SUCCESS

优惠券 = AVAILABLE

库存 = 99
它不应该立即:

FAILED
Agent可以根据系统知识判断:

库存由异步MQ更新,需要等待最终一致。

于是调用:

wait_inventory_consistency
再检查。

10秒以后仍然:

99
才真正失败。

然后自动继续:

查询MQ Trace。

trace = query_mq(
key="ORDER_10086"
)
发现:

RefundSuccessEvent
sent = 1

InventoryRollback
consumed = 0
再查日志:

logs = search_log(
keyword="ORDER_10086"
)
发现:

inventory-service

ERROR:
consumer timeout
最后Agent给出的已经不是:

退款测试失败。
而可能是:

测试失败

影响:
退款成功后库存未恢复。

已确认:
订单状态正常
支付退款成功
优惠券已返还

异常模块:
inventory-service

证据:
InventoryRollback消息未被成功消费

建议:
检查库存消费服务及MQ积压。
这才开始接近企业真正想要的:

Autonomous QA。
十八、Argus最让我感兴趣的,其实不是“无脚本”
因为“自然语言测试”以前也有人做。

真正重要的是它把:

理解、探索、规划、执行

拆开。

这意味着未来测试Agent很可能不会是:

一个超级大模型
什么都干
而是:

Comprehender

Explorer

Planner

Executor

Evaluator
甚至继续扩展:

Diagnosis Agent

Bug Agent

Regression Agent
这种Multi-Agent测试架构。

这跟AI Coding正在发生的变化非常像。

十九、未来研发链路可能真的会变成“双Agent”
过去:

产品

开发

测试
AI Coding之后:

产品

Coding Agent

测试工程师
但如果Coding Agent一天能够提交几十个Change:

人类测试不可能永远线性跟着增加。

下一步很可能是:

    Coding Agent
          ↓
    生成代码/修改
          ↓
      提交Change
          ↓
      QA Agent
    ↙    ↓    ↘
  UI    API    DB
          ↓
      Evaluator
          ↓
     发现问题?
      ↙      ↘
    Yes       No
     ↓         ↓

Coding Agent修复 Merge

Re-Test
这就是:

AI写码Agent + AI测试Agent
形成闭环。

但有一个特别重要的前提:

绝不能让写代码的Agent自己给自己打满分。

二十、为什么“自己写、自己测”有风险?
假设Coding Agent生成:

def discount(price, level):

if level == "VIP":
    return price * 0.8

return price

然后它自己生成测试:

def test_discount():

assert discount(
    100,
    "VIP"
) == 80

通过。

于是它认为:

功能正确。
但是需求真正写的是:

VIP 8折

但单笔最高优惠50元。
对于:

1000元商品
正确价格应该:

950
而代码返回:

800
Coding Agent只测了:

自己理解到的需求。

于是产生一个非常危险的问题:

同源偏差。
这就是为什么开发Agent和测试Agent最好拥有:

独立上下文、独立测试策略甚至不同模型。

否则就变成:

自己出题。

自己答题。

自己判卷。

最后:

100分。

二十一、这也是未来测试工程师真正值钱的地方
如果你看到Argus以后,只得出:

以后测试不用写代码了。

我认为理解浅了。

恰恰相反。

未来测试开发可能更需要理解:

业务。

架构。

测试Oracle。

异步系统。

接口。

数据库。

Agent。

上下文。

工具调用。

评测指标。

因为AI可以帮你:

点击。

输入。

生成脚本。

探索页面。

但是有一个问题AI永远很难凭空知道:

到底什么叫“对”?

退款成功以后库存是不是必须立刻恢复?

订单金额和支付金额如何对账?

优惠券能不能重复返还?

一个请求执行两次应该生成两个订单还是一个?

管理员和普通用户到底有什么权限边界?

这些东西叫:

Business Oracle。
谁最懂这些?

还是长期理解业务系统的人。

二十二、顺便再送一道面试高频题:什么叫幂等?
假设Agent测试:

点击支付
网络卡了一下。

它没看到结果。

于是再点一次。

支付
支付
结果后端生成:

PAY_001
PAY_002
用户被扣了两次钱。

测试发现重大Bug。

这里面真正的知识点叫:

Idempotency。
一个幂等接口:

重复执行一次和执行多次:

最终业务效果应该一致。

例如:

headers = {
"Idempotency-Key":
"ORDER_10086_PAY"
}

requests.post(
"/pay",
json=data,
headers=headers
)
重复调用:

requests.post(
"/pay",
json=data,
headers=headers
)
服务端应该识别:

同一个业务请求。
而不是再创建一次支付。

你会发现:

Argus、Agentic QA这些新技术,最后真正落到测试里,绕不开的依然是:

幂等。

并发。

事务。

最终一致性。

缓存。

MQ。

权限。

这些经典问题。

所以AI时代最危险的学习方式是什么?

每天背:

Agent
MCP
Skill
Harness
RAG
结果面试官问:

为什么支付接口必须做幂等?

回答不上来。

那还是很难成为真正的AI测试开发工程师。

二十三、所以确定性脚本真的要消失吗?
不会。

我甚至认为恰恰相反。

未来测试体系很可能分成三层。

第一层:

Deterministic Test
稳定、关键、强规则。

例如:

assert order_total == 1000

assert pay_amount == 1000

assert stock == 98
这种测试:

不要让AI自由发挥。

第二层:

Agentic Test
适合:

探索。

异常路径。

UI变化。

未知场景。

自然语言需求。

复杂流程组合。

第三层:

AI Evaluator
负责:

理解复杂输出。

异常归类。

失败分析。

测试覆盖评估。

最终形成:

确定性自动化
+
概率性Agent
+
Evaluator
这才可能是更现实的下一代测试体系。

不是:

Agent替代Playwright。
而是:

Agent站到Playwright上面。
二十四、对于初级测试工程师,应该学什么?
看完Argus,不需要马上去造一个五Agent系统。

真正建议的顺序还是:

Python

HTTP/API

SQL

Playwright

Pytest

CI/CD

LLM基础

Tool Calling

MCP

Agent

Agent Evaluation
尤其不要跳过前半段。

因为Agent失败以后。

最终你还是要回答:

为什么接口404?

为什么Cookie没写进去?

为什么元素不可点击?

为什么数据库数据不一致?

为什么MQ延迟?

为什么接口重复提交?

为什么事务回滚?

AI能给你一个猜测。

但是:

测试开发工程师必须能判断这个猜测对不对。

写在最后
Argus现在当然还是一个很年轻的开源项目。

它目前重点解决的也是UI测试,而不是企业所有QA问题。

所以现在就喊:

测试脚本彻底消失。

显然言之过早。

但我认为它出现的时间点非常有意思。

因为过去两年软件行业几乎所有的AI效率提升,都优先发生在:

写代码。

Cursor。

Claude Code。

Codex。

Copilot。

越来越多Coding Agent出现以后,我们终于开始面对一个过去不存在的问题:

如果代码生成能力已经不再稀缺,谁来验证这些代码到底能不能上线?

于是测试突然重新变得重要。

只不过:

未来负责测试的不一定只有人。

很可能还有另外一群Agent。

Coding Agent负责疯狂生产Change。

QA Agent负责疯狂寻找问题。

人类测试工程师逐渐从:

亲自点每一个按钮
往:

设计测试规则
构建Tool
定义Oracle
治理测试Agent
分析真正高风险问题
移动。

这也是为什么我觉得,Argus真正值得测试工程师关注的不是:

“AI会不会把测试脚本干掉?”

而是:

AI已经把写代码这件事提速了,下一个必须被重新设计的环节,会不会恰恰就是测试?

如果答案是Yes。

那么未来最有价值的测试工程师,可能不再是:

最会写Case的人。

也不一定是:

最会写XPath的人。

而是那个真正知道:

什么必须测、什么才算通过、出了问题应该去哪找证据,以及怎么让一群Agent可靠地替团队完成这些工作的工程师。

这可能才是 Agentic QA 真正值得关注的地方。

相关文章
人工智能 缓存 前端开发
11700 59
人工智能 JavaScript 开发工具
4677 17
Web App开发 人工智能 API
1179 1
开发工具 Swift git
1890 6
人工智能 Java BI
1303 1
人工智能 JavaScript 测试技术
2145 2
人工智能 JavaScript 测试技术
1097 4
缓存 JavaScript Shell
2055 3