Vitest覆盖率服务器

一个为React Vite项目自动实现100% Vitest覆盖率的MCP服务器,支持AI测试生成、性能分析和CI/CD工作流生成。

  • by willboyden
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 willboyden/vitest-mcp-server

使用说明

Vitest复盖MCP服务器v2.0

🚀 概述

一个强大的 模型上下文协议(MCP)服务器 自动实现 100%Vitest覆盖率 React Vite项目。此增强版本包括AI驱动的测试生成、性能分析、CI/CD工作流生成和全面的覆盖率分析。

✨ 特性

核心功能

  • 🔧 自动Vitest设置 -安装并配置Vitest的100%覆盖阈值
  • 📊 覆盖率分析 -运行详细的覆盖率分析并识别未覆盖的代码
  • 🧪 测试生成 -为React组件创建全面的测试文件

🆕 高级功能(v2.0)

  • 🤖 AI驱动的测试编写器 -使用OpenAI GPT生成高质量、上下文感知的测试
  • 📈 保险范围差异和徽章 -生成SVG徽章,显示分支之间的覆盖范围变化
  • ⚡ 测试性能分析器 -识别慢速测试并提供优化建议
  • 🔄 CI/CD工作流生成器 -创建GitHub操作和GitLab CI配置
  • 🏗️ 插件架构 -用于动态添加新工具的可扩展系统
  • 📝 结构化日志记录 -基于Pino的日志记录,具有请求跟踪和错误处理功能
  • 🐳 Docker支持 -使用Redis进行完全容器化缓存
  • 📱 增强型API -具有详细健康检查的全面RESTful端点

🛠️ 安装

快速启动(开发)

git clone <repository-url>
cd vitest-mcp-server
npm install
npm run dev  # Starts server on http://localhost:3000

Docker安装程序(推荐)

# Build and run with docker-compose
docker-compose up --build

# Or build manually
docker build -t vitest-mcp-server .
docker run -p 3000:3000 -v $(pwd)/projects:/app/projects vitest-mcp-server

环境变量

# LLM Provider Configuration (choose one)
# OpenAI (default)
export OPENAI_API_KEY=your_openai_api_key

# LM Studio
export LLM_PROVIDER=lmstudio
export LMSTUDIO_BASE_URL=http://localhost:1234

# Ollama  
export LLM_PROVIDER=ollama
export OLLAMA_BASE_URL=http://localhost:11434

# llama.cpp Server
export LLM_PROVIDER=llamacpp
export LLAMACPP_BASE_URL=http://localhost:8080

# MLX (Apple Silicon)
export LLM_PROVIDER=mlx
export LLM_MODEL=/path/to/your/model

# Common settings for all providers
export PORT=3000
export LOG_LEVEL=info
export NODE_ENV=production

📚 API 文档

健康和状态端点

  • GET /health -使用配置信息进行详细的服务器健康检查
  • GET /api -API信息和可用端点

核心工具端点(通过插件系统)

  • POST /setup-vitest -在项目中初始化Vitest
  • POST /analyze-coverage -运行覆盖率分析并找出差距
  • POST /generate-tests -为未覆盖的组件创建基本测试文件

🆕 高级工具端点

  • POST /ai-generate-tests -生成AI驱动的测试(需要OpenAI API密钥)
  • POST /coverage-diff -比较分支机构之间的覆盖范围
  • GET /coverage-badge.svg -为覆盖范围变化生成SVG徽章
  • GET /profile-tests -分析测试性能并确定瓶颈
  • POST /generate-workflow -创建CI/CD工作流配置

AI特定端点

  • GET /ai-health -检查当前LLM提供程序配置和连接

🤖 LLM提供程序配置

该服务器支持多个LLM提供商,使您可以灵活地使用云服务或在本地运行模型,以保护隐私和节省成本。

支持的提供商

1. 开放人工智能 (默认)

具有GPT模型的基于云的API。

export LLM_PROVIDER=openai
export OPENAI_API_KEY=your_api_key_here
export LLM_MODEL=gpt-4o-mini  # or gpt-3.5-turbo
export OPENAI_BASE_URL=https://api.openai.com/v1

mcp.config.json中的配置:

{
  "llmProvider": {
    "type": "openai",
    "baseUrl": "https://api.openai.com/v1",
    "model": "gpt-4o-mini",
    "apiKey": "${OPENAI_API_KEY}",
    "maxTokens": 2000,
    "temperature": 0.2
  }
}

2. LM 工作室

用于使用与OpenAI兼容的API运行本地模型的桌面应用程序。

设置:

  1. 下载 LM 工作室
  2. 加载本地模型(例如,Llama 2、CodeLlama、Mistral)
  3. 启动服务器(默认值:http://localhost:1234)
export LLM_PROVIDER=lmstudio
export LMSTUDIO_BASE_URL=http://localhost:1234
export LLM_MODEL=local-model-name

mcp.config.json中的配置:

{
  "llmProvider": {
    "type": "lmstudio",
    "baseUrl": "http://localhost:1234",
    "model": "llama-2-7b-chat",
    "maxTokens": 2000,
    "temperature": 0.2
  }
}

3. 奥拉玛

本地LLM的轻量级容器化。

设置:

  1. 安装 奥拉玛
  2. 拉一个模型: ollama pull llama2
  3. 服务器在上运行http://localhost:11434
export LLM_PROVIDER=ollama
export OLLAMA_BASE_URL=http://localhost:11434
export LLM_MODEL=llama2

mcp.config.json中的配置:

{
  "llmProvider": {
    "type": "ollama",
    "baseUrl": "http://localhost:11434",
    "model": "llama2",
    "maxTokens": 2000,
    "temperature": 0.2
  }
}

4. llama.cpp服务器

使用HTTP服务器对LLM进行高性能推理。

设置:

  1. 构建支持服务器的llama.cpp
  2. 启动HTTP服务器: ./server -m model.gguf -host 0.0.0.0 -port 8080
export LLM_PROVIDER=llamacpp
export LLAMACPP_BASE_URL=http://localhost:8080
export LLM_MODEL=model.gguf

mcp.config.json中的配置:

{
  "llmProvider": {
    "type": "llamacpp",
    "baseUrl": "http://localhost:8080",
    "model": "codellama-7b.gguf",
    "maxTokens": 2000,
    "temperature": 0.2
  }
}

5. 玻璃直线磨斜边机 (苹果硅)

苹果的机器学习框架,用于在M1/M2芯片上进行高效推理。

设置:

  1. 按照以下步骤安装MLX Apple的文档
  2. 确保您的模型可以在本地访问
  3. 安装MLX Python包: pip install mlx-lm
export LLM_PROVIDER=mlx
export LLM_MODEL=/path/to/your/model

mcp.config.json中的配置:

{
  "llmProvider": {
    "type": "mlx",
    "model": "./models/llama-2-7b-mlx",
    "maxTokens": 2000,
    "temperature": 0.2
  }
}

提供商选择方法

方法1:环境变量(推荐)

集 LLM_PROVIDER 要指定您选择的提供商,请执行以下操作:

export LLM_PROVIDER=lmstudio  # or ollama, llamacpp, mlx, openai

方法2:配置文件

编辑 mcp.config.json 并设置 llmProvider.type 现场。

方法3:健康检查端点

测试提供商连接:

curl http://localhost:3000/ai-health

提供商健康监控

所有医疗服务提供者都支持通过 /ai-health 端点:

  • 开放人工智能:验证API密钥和模型的可用性
  • LM Studio/ollama/calla.cpp:检查服务器连接
  • 玻璃直线磨斜边机:验证Python环境和模型可访问性

提供商的模型建议

用例 推荐型号
代码生成 CodeLlama、StarCoder、DeepSeek编码器
通用 火焰2/3,米斯特拉尔,米斯特拉尔
低资源 TinyLama,Phi-2/3
高质量 火焰370B,GPT-4,克劳德

性能注意事项

提供者 速度 资源使用率 质量
开放人工智能 ⚡⚡⚡ 💰 API成本 ⭐⭐⭐⭐⭐
LM 工作室 ⚡⚡ 💻 本地CPU/GPU ⭐⭐⭐⭐
奥拉玛 ⚡⚡ 🐳 Docker+本地⭐⭐⭐
llama.cpp ⚡⚡⚡ 🔧 优化的C++⭐⭐⭐
玻璃直线磨斜边机 ⚡⚡⚡🍎 🍎 仅限苹果硅⭐⭐⭐⭐

本地LLM故障排除

常见问题:

  1. 连接被拒绝:确保您的本地服务器在正确的端口上运行
  2. 未找到型号:验证模型名称和文件路径是否正确
  3. 内存不足:尝试较小的型号或增加系统RAM
  4. 慢世代:检查CPU/GPU利用率并考虑量化模型

调试命令:

# Test LM Studio connectivity
curl http://localhost:1234/v1/models

# Test Ollama connectivity  
curl http://localhost:11434/api/tags

# Check llama.cpp server health
curl http://localhost:8080/health

# Verify MLX installation
python3 -c "import mlx_lm; print('MLX installed correctly')"

🎯 用法示例

基本工作流程

# 1. Setup Vitest in your project
curl -X POST http://localhost:3000/setup-vitest \
  -H "Content-Type: application/json" \
  -d '{"projectPath":"/path/to/your/react-vite-project"}'

# 2. Analyze current coverage
curl -X POST http://localhost:3000/analyze-coverage \
  -H "Content-Type: application/json" \
  -d '{"projectPath":"/path/to/your/react-vite-project"}'

# 3. Generate tests for uncovered files
curl -X POST http://localhost:3000/generate-tests \
  -H "Content-Type: application/json" \
  -d '{"projectPath":"/path/to/your/react-vite-project"}'

高级AI驱动的工作流程(任何LLM提供商)

# Generate high-quality tests using your configured LLM provider
curl -X POST http://localhost:3000/ai-generate-tests \
  -H "Content-Type: application/json" \
  -d '{
    "projectPath": "/path/to/your/react-vite-project",
    "uncoveredFiles": [
      {"file": "src/components/Button.tsx", "type": "statement"},
      {"file": "src/pages/Home.tsx", "type": "function"}
    ]
  }'

覆盖范围分析和徽章

# Generate coverage diff between current and main branch
curl -X POST http://localhost:3000/coverage-diff \
  -H "Content-Type: application/json" \
  -d '{"baseBranch": "main"}'

# Get coverage change badge (SVG)
curl http://localhost:3000/coverage-badge.svg > coverage-delta.svg

性能分析

# Analyze test performance and get recommendations
curl http://localhost:3000/profile-tests | jq '.recommendations'

CI/CD工作流生成

# Generate GitHub Actions workflow
curl -X POST http://localhost:3000/generate-workflow \
  -H "Content-Type: application/json" \
  -d '{"platform": "github", "projectName": "my-react-app"}'

🔧 配置

mcp.config.json

服务器支持通过以下方式进行可选配置 mcp.config.json:

{
  "projectRoot": "/Volumes/Ddrive/LMStudioOutput/vitest-mcp-server",
  "port": 3000,
  "logLevel": "info",
  "coverageThresholds": {
    "statements": 100,
    "branches": 100,
    "functions": 100,
    "lines": 100
  },
  "openaiKeyEnvVar": "OPENAI_API_KEY",
  "corsOrigins": ["http://localhost:3000"],
  "aiModel": {
    "name": "gpt-4o-mini",
    "temperature": 0.2,
    "maxTokens": 2000
  }
}

🏗️ 插件架构

服务器使用动态插件系统。要添加新工具,请执行以下操作:

  1. 在中创建新文件 src/tools/
  2. 使用以下命令导出默认对象:
    export default {
      name: 'my-tool-name',
      router(app: Express) {
        app.post('/my-endpoint', async (req, res) => {
          // Your tool logic here
        });
      }
    };
    
  3. 该工具将自动加载和注册

📊 覆盖率分析功能

详细报告

  • 未披露的声明 -逐行报表覆盖率分析
  • 分支覆盖 -条件分支分析
  • 功能覆盖范围 -功能级覆盖指标
  • 文件级分析 -按文件覆盖率细分

可视化工具

  • HTML覆盖率报告 -服务于 /coverage 端点
  • SVG徽章 -动态覆盖变化徽章
  • JSON报告 -机器可读覆盖数据

🤖 AI测试生成

特性

  • 多LLM支持 -与OpenAI、LM Studio、Ollama、llama.cpp和MLX合作
  • 上下文感知 -分析组件结构和支撑
  • 高质量测试 -使用React测试库最佳实践
  • 边缘保护壳覆盖范围 -自动处理常见场景
  • 快照测试 -在适当的时候包括快照测试

需求

  • 任何LLM提供者 -OpenAI API密钥、LM Studio服务器、Ollama安装、llama.cpp服务器或MLX设置
  • 有效的React组件文件(.tsx/.jsx)
  • 允许相对进口的项目结构

⚡ 性能分析

测试分析

  • 执行时间跟踪 -每次测试持续时间分析
  • 瓶颈识别 -查找运行缓慢的测试
  • 优化建议 -提出改进建议
  • 套件分析 -按组织测试套件分组

建议包括

  • 测试时间过长(>2s)
  • 并行化候选人
  • 仅呈现测试中缺少断言
  • 潜在的测试拆分机会

🔄 CI/CD集成

支持平台

  • GitHub操作 -完整的工作流程,包括覆盖率报告
  • GitLab 的 -多级管道配置

生成的工作流包括

  • Node.js矩阵测试(18.x,20.x)
  • 自动向Codecov报告覆盖范围
  • 覆盖报告的工件上传
  • 带有报道信息的公关评论
  • 100%覆盖阈值强制执行

🐳 Docker配置

服务包括

  • MCP服务器 -主应用程序容器
  • Redis堆栈 -缓存和会话管理(可选)
  • RedisInsight -数据库可视化工具

卷

  • mcp_data -应用程序数据持久性
  • redis_data -Redis数据持久化
  • ./projects:/app/projects:ro -项目分析(只读装载)

📈 监控和记录

结构化日志记录

  • 基于Pino -带时间戳的JSON结构化日志
  • 请求跟踪 -所有记录了持续时间的HTTP请求
  • 错误跟踪 -用于调试的堆栈跟踪和上下文
  • 可配置级别 -调试、信息、警告、错误

健康监测

  • 正常运行时间跟踪
  • 功能可用性检查
  • 配置验证
  • 外部服务连接(OpenAI、Redis)

🧪 测试服务器

演示工作流脚本

# Run the complete demo workflow
./scripts/demo-workflow.sh /path/to/your/react-project

# With OpenAI API key for AI features
export OPENAI_API_KEY=your_key_here
./scripts/demo-workflow.sh /path/to/your/react-project

手动测试

# Check server health
curl http://localhost:3000/health | jq

# Test basic functionality
npm run setup          # Setup Vitest in current project
npm run coverage       # Run coverage analysis
npm run ai-test        # Generate AI tests (if OpenAI configured)
npm run profile-tests  # Analyze test performance

🚀 部署

生产注意事项

  • 集 NODE_ENV=production
  • 配置适当的日志记录级别
  • 设置监控和警报
  • 对敏感数据使用环境变量
  • 在高流量场景中考虑使用Redis进行缓存

扩展

  • 无状态设计允许水平扩展
  • Redis可用于跨实例共享缓存
  • 负载平衡器与健康检查端点友好

🤝 贡献

开发设置

git clone <repository>
cd vitest-mcp-server
npm install
npm run dev  # Development mode with hot reload

添加新功能

  1. 在中创建插件 src/tools/
  2. 为插件添加测试
  3. 更新文档
  4. 提交拉取请求

📝 许可证

MIT-有关详细信息,请参阅许可证文件。

🆘 支持

  • 文档:此README和内联代码注释
  • 问题:GitHub错误报告和功能请求问题
  • 讨论:GitHub问题和想法讨论

由以下材料制成❤️ React测试社区

服务器提供三个主要功能:

  1. 设置Vitest –安装和配置Vitest、React测试库和必要的覆盖阈值。
  2. 分析覆盖范围 –在启用覆盖的情况下运行Vitest,解析生成的 coverage-final.json,以及未发现报表/分支/功能的报告。
  3. 生成测试 自动为未覆盖的React组件创建骨架测试文件,确保每个组件至少有一个基本的渲染测试。

通过链接这些端点,您可以迭代到 全面覆盖 (100%语句、分支、函数和行)由Vitest强制执行 coverage 配置。


先决条件

  • Node.js>=18(推荐)
  • npm或Yarn已在全球范围内安装
  • 一个你想提高覆盖率的React Vite项目

安装

# Clone this repo (or copy the files into your project)
git clone https://github.com/your-org/vitest-coverage-mcp-server.git
cd vitest-coverage-mcp-server

# Install server dependencies npx npm install   # or `yarn`

构建并运行服务器

# Compile TypeScript
npm run build

# Start the server (default port 3000)
npm start

服务器将在以下位置可访问 http://localhost:3000.


API终点

所有端点都接受 JSON payloads并返回JSON响应。

1.健康检查

GET /health

答复:

{ "status": "ok", "timestamp": "2025-11-11T12:34:56.789Z" }

2.设置Vitest

POST /setup-vitest
Content-Type: application/json
{
  "projectPath": "/absolute/path/to/your/react-vite-project"
}
  • 安装 vitest, @testing-library/react,以及 @vitejs/plugin-react 如果他们失踪了。
  • 生成默认值 vitest.config.ts (如果不存在) 100%覆盖阈值.
  • 创建 src/setupTests.ts 用于全局测试设置。

响应(示例):

{ "success": true, "result": { "message": "Vitest setup complete", "stdout": "..." } }

3.分析覆盖范围

POST /analyze-coverage
Content-Type: application/json
{
  "projectPath": "/absolute/path/to/your/react-vite-project"
}
  • 执行 vitest run --coverage.
  • 解析生成的覆盖率报告(coverage/coverage-final.json).
  • 返回未覆盖项的列表。

响应(示例):

{
  "success": true,
  "uncovered": [
    {"file":"src/components/Button.tsx","type":"statement","id":"12"},
    {"file":"src/pages/Home.tsx","type":"function","id":"4"}
  ],
  "coveragePath": "/absolute/path/to/project/coverage/coverage-final.json"
}

4.生成测试

POST /generate-tests
Content-Type: application/json
{
  "projectPath": "/absolute/path/to/your/react-vite-project",
  "uncoveredFiles": ["src/components/Button.tsx", "src/pages/Home.tsx"]
}
  • 如果 uncoveredFiles 如果省略,服务器将首先调用 分析覆盖范围 查找丢失的文件。
  • 创建一个 __tests__/ 目录镜像源代码树。
  • 对于每个未覆盖的React组件,一个基本测试文件 <Component>.test.tsx 使用生成 React测试库:
    import { render } from '@testing-library/react';
    import Button from '../../src/components/Button';
    
    test('renders Button without crashing', () => {
      const { container } = render(<Button />);
      expect(container).toBeTruthy();
    });
    
  • 现有测试文件为 未被覆盖.

响应(示例):

{ "success": true, "generatedTestFiles": ["/project/__tests__/components/Button.test.tsx"] }

实现100%覆盖的完整工作流程

# 1️⃣ Setup Vitest in your project (run once)
curl -X POST http://localhost:3000/setup-vitest \
  -H "Content-Type: application/json" \
  -d '{"projectPath":"/path/to/react-vite-project"}'

# 2️⃣ Run coverage analysis and generate tests repeatedly until no uncovered items remain.
while true; do
  # Analyze coverage & capture uncovered files
  UNCOVERED=$(curl -s -X POST http://localhost:3000/analyze-coverage \
    -H "Content-Type: application/json" \
    -d '{"projectPath":"/path/to/react-vite-project"}' | jq -r '.uncovered[].file')

  if [ -z "$UNCOVERED" ]; then
    echo "✅ All files covered!"
    break
  fi

  # Generate tests for uncovered files
  curl -X POST http://localhost:3000/generate-tests \
    -H "Content-Type: application/json" \
    -d "{\"projectPath\":\"/path/to/react-vite-project\", \"uncoveredFiles\":[$(printf '"%s",
' $UNCOVERED | tr -d '\n')]}"

done

循环将继续创建骨架测试,重新运行覆盖率,并停止一次 100% 达到阈值。


高级定制

  • 自定义测试模板 –编辑 src/tools/generateTests.ts 修改测试支架。
  • 不同的覆盖阈值 –更改 vitest.config.ts 在...之下 coverage 部分。
  • 身份验证/速率限制 –如果公开服务器,则使用中间件包装Express路由。

故障排除

问题 原因 修复
vitest: command not found Vitest未全局安装。 运行 /setup-vitest 终结点或手动安装: npm i -D vitest.
覆盖率报告缺失 Vitest未运行 --coverage 或者该项目使用自定义测试运行器。 确保你打电话 /analyze-coverage;它迫使 vitest run --coverage.
生成的测试无法编译 组件使用了基本导入未涵盖的TypeScript功能。 手动调整生成的测试或扩展 generateTests.ts 处理道具和背景。

许可证

麻省理工学院-您可以自由地分叉、修改和集成到您自己的CI管道中。


贡献

  1. 分叉回购
  2. 创建要素分支(git checkout -b feat/xyz)
  3. 添加您的更改并运行 npm test
  4. 提交拉取请求