MCP Inspector与Playwright集成:E2E测试自动化实践

【免费下载链接】inspector Visual testing tool for MCP servers 【免费下载链接】inspector 项目地址: https://gitcode.com/gh_mirrors/inspector1/inspector

一、痛点直击:MCP服务器可视化测试的困境与解决方案

你是否在MCP(Management and Control Protocol)服务器测试中面临以下挑战?测试流程繁琐、跨浏览器兼容性问题频发、CLI参数配置与UI状态同步困难?本文将通过MCP Inspector与Playwright的深度集成方案,系统化解决这些问题,让你掌握企业级E2E(端到端)测试自动化实践。

读完本文你将获得:

  • 基于Playwright的MCP测试环境快速搭建指南
  • 三种传输协议(STDIO/SSE/Streamable HTTP)的自动化测试策略
  • CLI参数与UI状态同步的端到端验证方案
  • 跨浏览器兼容性测试的最佳实践
  • 可复用的测试代码模板与调试技巧

二、技术栈概览:为什么选择MCP Inspector + Playwright

2.1 核心组件解析

组件 功能 技术优势
MCP Inspector MCP服务器可视化测试工具 支持多传输协议、实时状态监控、配置参数可视化
Playwright 微软开源的E2E测试框架 跨浏览器支持、自动等待机制、网络拦截能力、无头模式
TypeScript 强类型JavaScript超集 类型安全、IDE智能提示、代码可维护性提升
Vite 前端构建工具 快速热更新、优化的开发体验

2.2 架构流程图

mermaid

三、环境搭建:从零开始的测试基础设施构建

3.1 系统要求

  • Node.js ≥ 16.0.0
  • npm ≥ 7.0.0
  • Git
  • 支持的浏览器:Chrome 90+、Firefox 88+、Safari 14+

3.2 快速安装步骤

# 克隆仓库
git clone https://gitcode.com/gh_mirrors/inspector1/inspector.git
cd inspector

# 安装依赖
npm install

# 构建项目
npm run build

# 启动开发服务器
npm run dev

3.3 Playwright环境配置

# 安装Playwright测试依赖
cd client
npm install --save-dev @playwright/test

# 安装浏览器二进制文件
npx playwright install

四、核心配置:Playwright测试框架深度定制

4.1 测试配置文件解析(playwright.config.ts)

import { defineConfig, devices } from "@playwright/test";

export default defineConfig({
  // 本地开发服务器配置
  webServer: {
    cwd: "..",                // 工作目录设置为项目根目录
    command: "npm run dev",   // 启动开发服务器命令
    url: "http://localhost:6274",  // 应用访问URL
    reuseExistingServer: !process.env.CI,  // CI环境不重用服务器
  },

  testDir: "./e2e",           // 测试用例目录
  outputDir: "./e2e/test-results",  // 测试结果输出目录
  
  // 并行测试配置
  fullyParallel: true,        // 所有测试文件并行执行
  forbidOnly: !!process.env.CI,  // CI环境禁止test.only
  retries: process.env.CI ? 2 : 0,  // CI环境重试2次,本地不重试
  workers: process.env.CI ? 1 : undefined,  // CI环境单worker
  
  // 测试报告配置
  reporter: process.env.CI
    ? [
        ["html", { outputFolder: "playwright-report" }],  // HTML报告
        ["json", { outputFile: "results.json" }],         // JSON报告
        ["line"],                                         // 命令行输出
      ]
    : [["line"]],

  // 全局测试选项
  use: {
    baseURL: "http://localhost:6274",  // 基础URL
    trace: "on-first-retry",           // 首次重试时记录跟踪
    screenshot: "only-on-failure",     // 仅失败时截图
    video: "retain-on-failure",        // 仅失败时保留视频
  },

  // 浏览器项目配置
  projects: [
    {
      name: "chromium",
      use: { ...devices["Desktop Chrome"] },
    },
    {
      name: "firefox",
      use: { ...devices["Desktop Firefox"] },
    },
    // macOS上跳过WebKit(兼容性问题)
    ...(process.platform !== "darwin"
      ? [
          {
            name: "webkit",
            use: { ...devices["Desktop Safari"] },
          },
        ]
      : []),
  ],
});

4.2 关键配置项说明

  • webServer: 自动启动开发服务器并等待其就绪,确保测试环境一致性
  • trace: 记录详细的测试执行轨迹,包含DOM快照、网络请求和视频录制
  • projects: 配置多浏览器测试矩阵,实现跨浏览器兼容性验证
  • reuseExistingServer: 开发环境重用现有服务器,大幅提升测试启动速度

五、测试实战:从基础场景到复杂交互

5.1 传输协议切换测试

MCP Inspector支持三种传输协议,我们需要验证UI能正确响应协议切换并更新相应表单字段:

import { test, expect } from "@playwright/test";

test.describe("传输协议切换测试", () => {
  const APP_URL = "http://localhost:6274/";
  
  test("应显示STDIO、SSE和Streamable HTTP三个选项", async ({ page }) => {
    await page.goto(APP_URL);
    
    // 点击传输类型下拉框
    const selectTrigger = page.getByLabel("Transport Type");
    await selectTrigger.click();
    
    // 验证三个选项都存在
    await expect(page.getByRole("option", { name: "STDIO" })).toBeVisible();
    await expect(page.getByRole("option", { name: "SSE" })).toBeVisible();
    await expect(page.getByRole("option", { name: "Streamable HTTP" })).toBeVisible();
  });
  
  test("选择STDIO时应显示命令和参数字段", async ({ page }) => {
    await page.goto(APP_URL);
    
    // 选择STDIO传输类型
    await page.getByLabel("Transport Type").click();
    await page.getByRole("option", { name: "STDIO" }).click();
    
    // 验证表单字段显示状态
    await expect(page.locator("#command-input")).toBeVisible();
    await expect(page.locator("#arguments-input")).toBeVisible();
    await expect(page.locator("#sse-url-input")).not.toBeVisible();
    
    // 验证标签文本
    await expect(page.getByText("Command")).toBeVisible();
    await expect(page.getByText("Arguments")).toBeVisible();
    await expect(page.getByText("URL")).not.toBeVisible();
  });
  
  test("选择SSE时应显示URL字段", async ({ page }) => {
    await page.goto(APP_URL);
    
    // 选择SSE传输类型
    await page.getByLabel("Transport Type").click();
    await page.getByRole("option", { name: "SSE" }).click();
    
    // 验证表单字段显示状态
    await expect(page.locator("#sse-url-input")).toBeVisible();
    await expect(page.locator("#command-input")).not.toBeVisible();
    await expect(page.locator("#arguments-input")).not.toBeVisible();
  });
  
  test("选择Streamable HTTP时应显示URL字段", async ({ page }) => {
    await page.goto(APP_URL);
    
    // 选择Streamable HTTP传输类型
    await page.getByLabel("Transport Type").click();
    await page.getByRole("option", { name: "Streamable HTTP" }).click();
    
    // 验证表单字段显示状态
    await expect(page.locator("#sse-url-input")).toBeVisible();
    await expect(page.locator("#command-input")).not.toBeVisible();
    await expect(page.locator("#arguments-input")).not.toBeVisible();
  });
});

5.2 CLI参数与UI状态同步测试

import { test, expect } from "@playwright/test";

test.describe("CLI参数同步测试 @cli", () => {
  test("应正确传递SSE传输协议参数", async ({ page }) => {
    // 模拟CLI调用: npx . --transport sse --server-url http://localhost:3000/sse
    await page.goto("http://localhost:6274/?transport=sse&serverUrl=http://localhost:3000/sse");
    
    // 验证传输类型下拉框显示SSE
    const selectTrigger = page.getByLabel("Transport Type");
    await expect(selectTrigger).toBeVisible();
    await expect(selectTrigger).toContainText("SSE");
    
    // 验证URL输入框已正确填充
    const urlInput = page.locator("#sse-url-input");
    await expect(urlInput).toBeVisible();
    await expect(urlInput).toHaveValue("http://localhost:3000/sse");
  });
  
  test("应正确传递Streamable HTTP参数", async ({ page }) => {
    // 模拟CLI调用: npx . --transport streamable-http --server-url http://localhost:3000/mcp
    await page.goto("http://localhost:6274/?transport=streamable-http&serverUrl=http://localhost:3000/mcp");
    
    // 验证传输类型下拉框显示Streamable HTTP
    const selectTrigger = page.getByLabel("Transport Type");
    await expect(selectTrigger).toContainText("Streamable HTTP");
    
    // 验证URL输入框已正确填充
    const urlInput = page.locator("#sse-url-input");
    await expect(urlInput).toHaveValue("http://localhost:3000/mcp");
  });
  
  test("STDIO协议不应传递额外参数", async ({ page }) => {
    // 模拟默认STDIO配置
    await page.goto("http://localhost:6274/");
    
    // 验证传输类型默认显示STDIO
    const selectTrigger = page.getByLabel("Transport Type");
    await expect(selectTrigger).toContainText("STDIO");
    
    // 验证命令和参数字段可见
    await expect(page.locator("#command-input")).toBeVisible();
    await expect(page.locator("#arguments-input")).toBeVisible();
  });
});

六、高级测试策略:处理复杂场景的解决方案

6.1 跨浏览器测试矩阵

Playwright的多浏览器支持让我们能够轻松验证不同浏览器环境下的兼容性:

// playwright.config.ts 中的浏览器配置
projects: [
  {
    name: "chromium",
    use: { ...devices["Desktop Chrome"] },
  },
  {
    name: "firefox",
    use: { ...devices["Desktop Firefox"] },
  },
  // 条件包含WebKit(排除macOS平台)
  ...(process.platform !== "darwin"
    ? [
        {
          name: "webkit",
          use: { ...devices["Desktop Safari"] },
        },
      ]
    : []),
]

6.2 测试执行命令参考

# 运行所有测试
npx playwright test

# 运行特定测试文件
npx playwright test cli-arguments.spec.ts

# 运行带标签的测试
npx playwright test --grep @cli

# 以UI模式运行(调试)
npx playwright test --ui

# 生成HTML报告
npx playwright show-report

# 在CI环境中运行(无头模式)
CI=true npx playwright test

6.3 测试数据管理策略

对于需要动态数据的测试场景,建议使用以下模式:

// 创建测试数据工厂
class TestDataFactory {
  static createTransportConfig(transport: 'sse' | 'streamable-http' | 'stdio', url?: string) {
    const config = {
      transport,
      serverUrl: url || `http://localhost:3000/${transport}`,
      timestamp: new Date().toISOString()
    };
    
    return config;
  }
}

// 在测试中使用
test("动态配置测试", async ({ page }) => {
  const testConfig = TestDataFactory.createTransportConfig('sse');
  await page.goto(`http://localhost:6274/?transport=${testConfig.transport}&serverUrl=${testConfig.serverUrl}`);
  
  // 验证配置
  await expect(page.locator("#sse-url-input")).toHaveValue(testConfig.serverUrl);
});

七、CI/CD集成:自动化测试流水线构建

7.1 GitHub Actions工作流示例

# .github/workflows/e2e-tests.yml
name: E2E Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Install Playwright browsers
        run: cd client && npx playwright install --with-deps
      
      - name: Build project
        run: npm run build
      
      - name: Run E2E tests
        run: cd client && npx playwright test
        env:
          CI: true
      
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: playwright-report
          path: client/playwright-report/

八、常见问题与调试技巧

8.1 测试失败排查流程

mermaid

8.2 实用调试技巧

  1. 使用Playwright Inspector

    PWDEBUG=1 npx playwright test
    
  2. 网络请求拦截

    // 拦截并修改网络请求
    await page.route('**/api/*', route => {
      route.fulfill({
        status: 200,
        body: JSON.stringify({ mock: 'data' })
      });
    });
    
  3. 慢动作执行

    test.use({ slowMo: 500 }); // 每个操作延迟500ms
    
  4. 截图和视频

    // 手动截图
    await page.screenshot({ path: 'screenshot.png' });
    

九、总结与未来展望

MCP Inspector与Playwright的集成方案为MCP服务器测试提供了全面的自动化解决方案,通过本文介绍的配置和测试策略,你可以:

  1. 实现多传输协议的自动化验证
  2. 确保CLI参数与UI状态的一致性
  3. 构建跨浏览器兼容性测试矩阵
  4. 集成CI/CD流水线实现持续测试

未来可以进一步探索:

  • 引入视觉回归测试(使用Playwright的截图比较功能)
  • 实现性能指标监控(加载时间、响应速度)
  • 扩展测试覆盖范围到WebSocket等更多协议
  • 构建测试数据可视化 dashboard

掌握这些实践将显著提升MCP服务器测试的可靠性和效率,减少手动测试成本,加速开发迭代周期。

如果你觉得本文有价值,请点赞收藏,并关注后续MCP测试进阶内容!

【免费下载链接】inspector Visual testing tool for MCP servers 【免费下载链接】inspector 项目地址: https://gitcode.com/gh_mirrors/inspector1/inspector

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐