返回首页

Testwire:通过 MCP 和 hot reload 的 AI 代理和 Flutter 测试

Testwire 是一个工具,用于通过 MCP 和 hot reload 将 AI 代理集成到 Flutter 集成测试开发流程中,解决高令牌消耗和长构建周期的问题。它允许代理控制逐步测试执行、截取屏幕截图并进行修复,而无需完整重建,从而提高开发效率。

Testwire:使用 AI 代理和 MCP 革新 Flutter 测试
Advertisement 728x90

# 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 工具:

Google AdInline article slot
  • 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 可能需要调整代理技能和文档,但它将集成测试变成核心任务,而非事后补救。

Google AdInline article slot

关键要点

  • Testwire 解决 AI 代理在测试编写中的痛点:高令牌成本、缓慢构建、无视觉反馈。
  • 它通过 MCP 接入 VM 服务,让代理逐步掌控测试。
  • 热重载实现无重建修复,加速开发周期。
  • 测试基于类设计,支持热重载和双模式 CI/CD 兼容。
  • 需要初始设置,但它将测试嵌入每个开发工作流。

— Editorial Team

Advertisement 728x90

继续阅读