# Testwire:通过 MCP 和热重载将 AI 代理集成到 Flutter 集成测试
AI 代理在编写 Flutter 集成测试时面临高令牌消耗、漫长构建时间以及缺乏视觉上下文等问题。Testwire 通过提供逐步测试执行工具来解决这些痛点,该工具通过 MCP 连接到 VM 服务。这让代理能够掌控测试流程、截取屏幕截图,并利用热重载快速修复问题。
Testwire 架构及其工作原理
Testwire 由三个关键组件组成,它们通过模型上下文协议(MCP)进行交互。测试以 flutter run 模式运行,并带有 --dart-define=AGENT_MODE=true 标志,以启用调试模式和 Dart VM 服务扩展。testwire_mcp MCP 服务器通过 VM 服务连接到测试,为代理提供一整套管理执行的工具。作为 MCP 客户端,AI 代理利用这些工具监控步骤状态、运行命令,并结合 UI 视觉信息分析错误。
代理可用的关键 MCP 工具:
connect:通过 VM 服务 URI 连接到测试。step_forward:运行下一个步骤并暂停。run_remaining:执行剩余所有步骤,遇错停止。retry_step:重试失败的步骤。get_test_state:获取所有测试步骤的状态。hot_reload_testwire_test:热重载,同时保留进度。hot_restart_testwire_test:完全重启测试。screenshot:捕获当前 UI 截图。disconnect:断开与测试的连接。
在 Testwire 中实现测试:代码与结构
Testwire 测试以扩展 TestwireTest 的类形式结构化,以支持热重载。每个测试拆分为逻辑步骤,每个步骤有 pending、已完成、运行中或失败等状态。步骤使用 step 方法定义,包括描述、上下文和动作。下面是一个验证反馈表单的示例测试结构:
class MyTest extends TestwireTest {
MyTest() : super(
'Submit feedback form',
setUp: (tester) async {
app.main();
await tester.pumpAndSettle();
},
);
@override
Future<void> body(WidgetTester tester) async {
await step(
description: 'Navigate to Leave Review',
context: 'Tap the "Leave Review" tile on the home screen.',
action: () async {
await tester.tap(find.byKey(const Key('leave_review_tile')));
await tester.pumpAndSettle();
},
);
await step(
description: 'Enter name',
context: 'Type "Alex" into the name field.',
action: () async {
await tester.enterText(
find.byKey(const Key('name_field')), 'Alex');
await tester.pumpAndSettle();
},
);
await step(
description: 'Tap 5-star rating',
context: 'Tap the 5th star to set rating to 5.',
action: () async {
await tester.tap(find.byKey(const Key('star_5')));
await tester.pumpAndSettle();
},
);
await step(
description: 'Verify result',
context: 'Check that the success message is displayed.',
action: () async {
expect(find.text('Thank you!'), findsOneWidget);
expect(find.text('5 stars from Alex'), findsOneWidget);
},
);
}
}
热重载作为核心调试机制
Testwire 的热重载功能允许代理在不进行完整重建的情况下修复测试代码,同时保留执行进度。当步骤失败时,测试会暂停,代理审查日志、VM 状态和 UI 截图,然后触发热重载并重试。这将开发周期从 15–20 分钟缩短到几轮迭代,大幅降低令牌成本和上下文窗口使用。热重载支持要求使用基于类的测试(而非函数),以在重载间维持状态。
集成到开发和 CI/CD 工作流
Testwire 提供两种模式:开发用的代理模式和 CI/CD 用的标准模式。在开发中,使用 flutter run --dart-define=AGENT_MODE=true 运行测试,以启用 MCP 和热重载。在 CI 上,使用 flutter test 作为普通集成测试,无需额外标志。这种单测试文件方法确保一致性并简化维护。集成 Testwire 可能需要调整代理技能和文档,但它将集成测试变成核心任务,而非事后补救。
关键要点
- Testwire 解决 AI 代理在测试编写中的痛点:高令牌成本、缓慢构建、无视觉反馈。
- 它通过 MCP 接入 VM 服务,让代理逐步掌控测试。
- 热重载实现无重建修复,加速开发周期。
- 测试基于类设计,支持热重载和双模式 CI/CD 兼容。
- 需要初始设置,但它将测试嵌入每个开发工作流。
— Editorial Team
暂无评论。