AWS AI Agent测试通过却漏检:一次真实实验复盘

AI Agent 测试全绿不等于需求覆盖,需独立核算并逐条核对断言。
开发者在个人 AWS 实验室用虚构部署 CSV 做了一次实验:让 Amazon Nova 2 Lite 通过 Bedrock AgentCore Code Interpreter 生成并执行 Python 代码,计算不健康检查总数和已完成的不健康周期时长。开发者先手工算出预期结果,再与 Agent 输出比对,数字完全一致,程序也打印了测试通过标记。但阅读生成的测试代码后发现,测试只覆盖了周期数量和时长,未对每个预期的开始、结束时间戳写断言。测试通过只说明已写出的断言通过,不代表每项需求都被测试过。开发者由此建议保留输入、实际运行的代码和输出,并在信任「通过」标记前把测试与原始需求逐条对照。
AI Agent 生成的代码测试全绿,就等于任务完成了吗?一位开发者在个人 AWS 实验室里做了一次小实验,结果发现:测试通过,并不代表需求被完整覆盖。

实验背景:从一份部署历史开始
开发者没有连接任何生产环境,而是准备了一份自制的 CSV 文件。这份文件记录了 12 次部署检查,每次间隔 5 分钟,包含时间戳、健康状态、期望版本、运行版本、健康实例数、期望实例数以及活跃告警数等字段。
数据是虚构的,没有任何真实生产事故作为背景。
任务本身不复杂:计算两个数字——不健康检查的总数,以及每一段已完成的不健康持续时长。第二个数字需要一个明确的规则:不健康周期从第一个不健康检查开始,到其后第一个健康检查结束;如果文件结束时仍处于不健康状态,则该周期视为未完成。
开发者特意在把任务交给 Agent 之前,自己先手工算了一遍。以 10:10 的第一个不健康检查为例,下一个健康检查出现在 10:25,因此该周期为 15 分钟。这一步很关键:先建立独立预期,才能判断 Agent 的输出是否真的可靠。
Agent 怎么写代码、怎么跑代码
模型使用的是 Amazon Nova 2 Lite,通过托管 Agent 环境调用。开发者向模型提供了计算规则、三个小型测试用例以及目标 CSV,但没有给任何实现代码。
模型自行生成了 Python 程序,并将其发送到 Amazon Bedrock AgentCore Code Interpreter,在一个独立的执行环境中运行。整个流程可以概括为:
提供的 CSV → 模型生成 Python → Code Interpreter 执行 → 返回结果
开发者做了两件事:一是把返回的数字与自己预先算出的结果比对;二是阅读模型生成的测试代码。保留的执行流显示,只有一次 Code Interpreter 调用,其中包含生成的程序,工具输出中带有测试通过标记和计算结果。这意味着可以做一次真正的核验:看实际运行了什么,而不是信任模型对运行的总结。
Amazon Nova 2 Lite 是亚马逊在 2024 年 re:Invent 大会上发布的基础模型系列之一,定位为低延迟、低成本的中小型模型,适合代码生成、数据分析等对响应速度敏感的场景。Bedrock AgentCore 是 Amazon Bedrock 的扩展能力,为 AI Agent 提供托管运行环境,包含 Code Interpreter(代码解释器)等沙箱工具。Code Interpreter 会在与主模型隔离的容器中执行模型生成的代码,避免脚本影响宿主系统,同时允许 Agent 通过工具调用获取真实的执行结果。这种「模型生成 + 沙箱执行」的架构是当前 Agent 完成计算类任务的常见形态,也是本次实验中能够保留执行流水、核验实际运行内容的基础。
数字全对,测试却有缺口
在 Agent 运行之前,开发者已经独立算出了预期结果,输出完全匹配:
| 检查项 | 结果 |
|---|---|
| 总样本数 | 12 |
| 不健康样本数 | 5 |
| 不健康样本占比 | 41.7% |
| 已完成的不健康周期数 | 2 |
| 周期时长 | 15 分钟和 10 分钟 |
41.7% 是 12 个样本中有 5 个不健康,并不代表应用有 41.7% 的时间处于宕机状态。程序还打印了 MODEL_GENERATED_TESTS=PASS。
问题出在测试覆盖范围上。开发者的提示词要求针对每一个声明的测试预期都写断言,也就是那些在预期不满足时会让程序停止的检查。但生成的测试只覆盖了周期数量和时长,并没有显式检查每个预期的开始和结束时间戳。
目标输出中的时间戳是正确的,所以答案本身没有错。缺口在于测试实际证明了什么。
“测试通过”意味着已写出的断言通过了,并不意味着每一项需求都被测试过。比对结果和阅读断言,回答的是两个不同的问题。
测试覆盖率(test coverage)通常衡量测试代码执行了多少行或多少分支,但这里所说的「缺口」不是行覆盖率,而是需求覆盖率——即提示词中声明的每一项断言是否都有对应的测试存在。两者容易混淆:即使行覆盖率达到 100%,如果测试本身没有检查开始与结束时间戳,那条需求仍处于未被验证的状态。在 AI 生成代码的场景中,模型倾向于围绕最核心、最显眼的输出(如周期数量、时长)编写断言,而容易忽略边界条件或辅助字段。因此阅读生成的测试代码,本质上是在做一次需求追溯(requirement traceability),把每条原始要求映射到具体的断言上。
这次运行能说明什么,不能说明什么
这次实验展示了:Agent 能够生成并执行分析代码,且输出与开发者独立计算的结果一致;同时也展示了为什么必须阅读生成的测试代码。
但它不能说明未来每次运行都能成功。畸形输入、访问限制、会话行为以及重复运行检查,都还有待后续评估。
对于这类分析任务,开发者建议把三样东西放在一起保留:输入、实际运行的代码,以及它的输出。然后在信任“通过”标记之前,把生成的测试与原始需求逐条对照。
相关推荐

WorkBuddy智能体实战:从AI问答到自动办公的跨越
WorkBuddy是腾讯推出的AI智能体桌面工作台,能读取本地文件、操作办公软件、执行多步骤任务并定时自动运行。本文详解其核心功能、与传统AI工具的本质区别及适用场景。

Anthropic研究:LLM让形式化软件验证规模化成为可能
Anthropic Frontier Red Team研究显示,LLM已能在上百个真实开源库的RISC-V汇编级别批量生成形式化证明,覆盖123个OSS-Fuzz库、239个入口点,合计约1.8亿行Rocq证明,并在过程中发现数百量级Bug。文章解析其规格生成、证明流水线、信任边界与成本下降路径。

提示词工程入门:从写提示词到构建AI协作能力
从提示词的四大作用到提示词工程的六步流程,系统梳理AI提示词工程的核心概念、商业价值与三层局限性,帮助初学者建立对提示词工程的完整认知框架。