大数跨境

测试人学习效率翻倍:这个 GitHub AI助手太省时间了

测试人学习效率翻倍:这个 GitHub AI助手太省时间了 51Testing软件测试网
2026-09-07
3
导读:十年测试老手基于MCP+OpenAI SDK+Chainlit构建GitHub助手,用自然语言搜索、分析开源测试项目,提升学习效率,附环境搭建与核心代码。
前言
干了10年+测试,我有个习惯:遇到新工具、新框架,第一反应就是上 GitHub 看看。但说实话,这个过程挺折磨人的。
记得去年想找个好用的 API 测试框架,我在 GitHub 上搜了整整一个下午。输入"api testing",出来 2 万多个结果。点开前几个,要么是几年没更新的,要么文档写得跟天书一样。有的时候你明明知道某个工具很火,但就是找不到它的最佳实践项目。
我花了一个周末时间,基于 MCP + OpenAI SDK + Chainlit 搞了个小工具,它能让 AI 直接调用 GitHub API,帮我们做那些繁琐的搜索、分析工作。
现在,我可以用自然语言告诉它:"帮我找找最近半年最火的 Python 测试框架,要测试覆盖率高的,社区活跃的。" 然后它就能给我一份详细的报告,包括项目特点、代码质量、社区活跃度,甚至还能分析测试结构。
这篇文章,就是我想跟你分享的这个工具,以及我是怎么用它来提升学习效率的。


一:这玩意儿到底是怎么工作的?

1.1 MCP:让 AI 学会"动手"
以前你想让 AI 分析一个 GitHub 项目,你得自己先搜出来,然后把链接、README 都复制粘贴给 AI。现在有了 MCP,你只需要说:"帮我分析一下 pytest 项目的测试结构",AI 就会自己:

去 GitHub 搜索 pytest 仓库

读取 README 和关键文件

分析测试目录结构

总结出测试策略
整个过程完全自动化,你只需要看着就行。

1.2 为什么选这套技术栈?
我试过好几种方案,最后选了 Python + MCP + OpenAI + Chainlit,原因很简单:
Python 3.12+:测试工程师最熟悉的语言,不用学新东西
MCP SDK:官方出品,稳定可靠,文档齐全
OpenAI SDK:兼容性好,通义千问、DeepSeek等都能用
Chainlit:界面漂亮,还能看到 AI 的思考过程
为什么不选别的?

LangChain:太复杂了,学起来头疼,而且很多功能我们用不上

纯 API 调用:代码写起来麻烦,调试更麻烦

Claude Desktop:功能受限,想定制点东西都不行

1.3 工作原理


二、环境搭建

2.1 系统要求检查
在开始之前,请确保你的系统满足以下要求:
软件要求:

Node.js:>= 22.0.0

Python:>= 3.12
验证安装:
BASH
# 检查 Node.js 版本
node --version  # 应显示 v22.x.x 或更高
 
# 检查 Python 版本
python --version  # 应显示 Python 3.12.x 或更高
如果版本不符合要求,请访问官网下载最新版本:

Node.js: https://nodejs.org/

Python: https://www.python.org/downloads/

2.2 创建项目目录和虚拟环境
虚拟环境是 Python 项目的最佳实践,它可以隔离项目依赖,避免版本冲突。
BASH
# 创建项目目录
mkdir mcp-github-assistant
cd mcp-github-assistant
 
# 创建 Python 虚拟环境
python -m venv venv
 
# 激活虚拟环境
# Windows:
venv\Scripts\activate
 
# macOS/Linux:
source venv/bin/activate
重要提示:每次打开新的终端窗口时,都需要重新激活虚拟环境。

2.3 安装 Python 依赖
在激活的虚拟环境中安装所需的库:
BASH
pip install mcp openai chainlit python-dotenv
依赖说明:

mcp:MCP 协议的 Python SDK

openai:OpenAI API 客户端(兼容多种 AI 模型)

chainlit:AI 应用 UI 框架

python-dotenv:环境变量管理工具

2.4 验证 GitHub MCP 服务
GitHub MCP 服务器是一个 Node.js 包,通过 npx 运行:
BASH
npx -y @modelcontextprotocol/server-github --version
如果看到版本号,说明安装成功。首次运行时,npx 会自动下载并缓存该包。

2.5 获取 GitHub Personal Access Token
这是最关键的一步,没有 Token 就无法访问 GitHub API。
详细步骤:
1
登录 GitHub,访问 https://github.com/settings/tokens
2
点击 Generate new token → Generate new token (classic)
3
填写 Token 描述:MCP GitHub Assistant for Testing
4
设置过期时间:建议选择 90 days(可根据需要调整)
5
选择权限范围:
针对测试人员的推荐配置:
public_repo(访问公开仓库)- 必选
read:user(读取用户信息)- 推荐
read:org(读取组织信息)- 推荐
repo(完整仓库访问)- 不推荐(权限过大)
delete_repo(删除仓库)- 不推荐(危险操作)
1
点击 Generate token
2
立即复制生成的 Token(格式:ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3
将 Token 保存到安全的地方(如密码管理器)
安全提示:

Token 等同于密码,切勿分享或提交到 Git 仓库

如果 Token 泄露,立即在 GitHub 上撤销并重新生成

定期更换 Token(建议每 90 天)

2.6 配置 AI 模型 API
本方案支持多种 AI 模型,你可以根据预算和需求选择,这里以心流为例:
获取步骤:
1
访问 https://platform.iflow.cn/
2
注册账号并完成实名认证
3
在 API Keys 页面创建新密钥
4
复制 API Key
配置参数:
ENV
AI_MODEL=qwen3-max
BASE_URL=https://apis.iflow.cn/v1
API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2.7 创建配置文件
在项目根目录创建 .env 文件,打开 .env,填入以下内容:
ENV
# AI 模型配置(根据你的选择填写)
AI_MODEL=qwen3-max
BASE_URL=https://apis.iflow.cn/v1
API_KEY=你的AI_API_KEY
 
# GitHub 配置
GITHUB_TOKEN=你的GitHub_Personal_Access_Token


三、核心代码实现

3.1 项目结构
CODE
mcp-github-assistant/
├── venv/                 # Python 虚拟环境
├── .env                  # 环境变量配置(敏感信息)
├── app.py                # 主程序文件

3.2 创建主程序文件 app.py
创建 app.py 文件,这是整个应用的核心:
PYTHON
"""GitHub助手 - 使用OpenAI SDK + MCP直接调用"""
import os
import json
import asyncio
from dotenv import load_dotenv
 
import chainlit as cl
from openai import AsyncOpenAI
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
 
# 加载环境变量
load_dotenv()
 
# 初始化 OpenAI 客户端
client = AsyncOpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL")
)
 
# MCP 服务器配置 (GitHub)
GITHUB_PARAMS = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-github"],
env={
"GITHUB_TOKEN": os.getenv("GITHUB_TOKEN"),
}
)
 
async def get_mcp_tools(session):
"""获取 MCP 工具并转换为 OpenAI 格式"""
mcp_tools = await session.list_tools()
return [
{
"type": "function",
"function": {
"name": tool.name,
"description": tool.description or "",
"parameters": tool.inputSchema,
},
}
for tool in mcp_tools.tools
]
 
@cl.on_chat_start
async def start():
"""应用启动时的初始化"""
cl.user_session.set("history", [])
await cl.Message(
content="🤖 GitHub 助手已上线!\n\n我可以帮您:\n"
"- 搜索测试相关的开源项目\n"
"- 分析项目的测试框架和代码质量\n"
"- 读取项目文档和代码文件\n"
"- 追踪 Issue 和 Pull Request\n\n"
"请告诉我您想了解什么?"
).send()
 
@cl.on_message
async def main(message: cl.Message):
"""处理用户消息的主函数"""
history = cl.user_session.get("history", [])
history.append({"role": "user", "content": message.content})
 
# 建立 MCP 连接
async with stdio_client(GITHUB_PARAMS) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
 
# 获取工具列表
openai_tools = await get_mcp_tools(session)
 
# 准备流式回复容器
final_answer = cl.Message(content="")
 
# 最大迭代次数,防止无限循环
max_iterations = 20
iteration = 0
task_completed = False
 
while iteration < max_iterations and not task_completed:
iteration += 1
 
# 发送请求给 AI
response = await client.chat.completions.create(
model=os.getenv("AI_MODEL", ""),
messages=history,
tools=openai_tools,
tool_choice="auto"
)
 
msg_obj = response.choices[0].message
history.append({
"role": "assistant",
"content": msg_obj.content or "",
"tool_calls": msg_obj.tool_calls
})
 
# 如果没有工具调用,说明任务完成
if not msg_obj.tool_calls:
task_completed = True
final_answer.content = msg_obj.content or ""
await final_answer.send()
break
 
# 处理所有工具调用
for tool_call in msg_obj.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
 
# 在 UI 上展示执行步骤
async with cl.Step(name=f"🔧 {func_name}") as step:
step.input = func_args
 
# 执行 MCP 工具调用
try:
tool_result = await session.call_tool(func_name, func_args)
result_text = "\n".join([
c.text if hasattr(c, 'text') else str(c)
for c in tool_result.content
]) if hasattr(tool_result, 'content') else str(tool_result)
step.output = result_text
except Exception as e:
step.output = f"❌ 执行失败: {str(e)}"
result_text = str(e)
 
# 将工具结果添加到历史
history.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": func_name,
"content": result_text
})
 
# 如果达到最大迭代次数但任务未完成,生成最终回答
if not task_completed:
final_response = await client.chat.completions.create(
model=os.getenv("AI_MODEL", ""),
messages=history,
stream=True
)
 
async for chunk in final_response:
if chunk.choices[0].delta.content:
await final_answer.stream_token(chunk.choices[0].delta.content)
 
await final_answer.send()
 
cl.user_session.set("history", history)

......

本文节选自第九十一期《51测试天地》

原创文章

测试人员的GitHub开源项目探索指南:用AI助手加速学习之旅

文章后续为大家详细讲解了:
使用场景、进阶技巧与学习方法论等

    

想继续阅读全文

或查看更多《51测试天地》的原创文章

请点击下方 阅读原文或扫描二维码 查看

图片

声明:本文为51Testing软件测试网 blues_C 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

【声明】内容源于网络
0
0
51Testing软件测试网
博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
内容 3941
粉丝 0
51Testing软件测试网 博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
总阅读3.0k
粉丝0
内容3.9k