Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

构建Testlink MCP并集成到Copilot(一)



现在已经完成了从需求分析->自动生成用例->自动生成脚本的过程,全部通过预定义的prompts和instructions让Copilot来完成的, 几乎不需要人为干涉了。

会从jira、swagger、wiki、changelog、merge request里获取信息来确定需求及变更,生成符合要求的用例,保存本地或者自动创建在testlink,可以立刻生成自动化脚本,也可以过些时候,指定testlink的测试集来生成自动化脚本。

在这个流程中,增加了testlink的mcp server。因为testlink是个比较老的产品了,没有官方的mcp,于是根据公司内部需求自己给做了一个。testlink mcp在这个自动生成的流程中的作用是:分析需求后生成的测试用例直接保存在testlink与成员共享,直接获取testlink的新老case来生成自动化脚本。至于自动运行、自动分析错误、自动上线那是之后的事情了,不在这几篇文章里记录。

这里会以testlink部分功能为例介绍如何构建一个简易的mcp server。

--------

正式开始。

选择使用python3.12,基于FastMCP来构建,部署到服务器上用的uvicorn和nginx。对于testlink,因为还在用1.9.20的版本,一个比较老的testlink-api-python-client还能用上。

安装uv:

curl -LsSf https://astral.sh/uv/install.sh | sh

添加项目依赖:

uv add fastmcp testlink-api-python-client
uv sync

此时,项目根目录会新建一个.venv的目录,包含了需要的python包,可以直接激活这个虚拟环境。

为了能与testlink交互,需要先获取testlink的api key,代表登陆人身份。

登陆testlink后,在主页左上角点击my settings的图标

进入设置页面,如果从来没有生成过api key的话,需要点击'generate a new key', 已有的话直接复制key的值。

接下来先加一个在copilot里用提示词查询testlink版本的简单方法。

新增一个testlink的帮助类,utils/testlink_util.py,只用于获取链接。

import testlink


class TestLinkUtils:

    def __init__(self, api_key):
        self.url = "http://testlink_server_url/lib/api/xmlrpc/v1/xmlrpc.php"
        self.key = api_key
        self._client = None

    def get_client(self):
        if self._client is None:
            self._client = testlink.TestlinkAPIClient(self.url, self.key)
        return self._client

在根目录新建一个server.py

from fastmcp import FastMCP
from utils.testlink_utils import TestLinkUtils


app = FastMCP("TESTLINK MCP Server")


def handle_headers():
    headers = get_http_headers()
    api_key = headers.get("devkey")
    return TestLinkUtils(api_key)


@app.tool()
def get_version() -> dict:
    """Retrieves version of testlink."""
    try:
        tl = handle_headers().get_client()
        version = tl.testLinkVersion()
        return {"testlink_version": version}
    except Exception as e:
        return {"error": f"Failed to get TestLink version: {str(e)}"}


if __name__ == "__main__":
    app.run(transport="http", port=8000)  # 这个之后要改

这里的http是能够将来部署后被网络上调用的意思。stdio则是本地调试的意思。

然后运行python server.py, 能看到fastmcp启动了一个server,这时在vscode或者pycharm里加一下mcp.json的配置即可在copilot中使用。

INFO     Starting MCP server 'TESTLINK MCP Server' with transport 'http' on http://127.0.0.1:8000/mcp             server.py:2618
INFO:     Started server process [16384]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

server启动后需要一个client,而client就是copilot。现在去IDE配置一下mcp.json并启动连接即可。

对于vscode,在打开的项目工程的根目录,有个.vscode的目录,里面往往有launch.json用于启动和调试,在同一个目录,新增一个mcp.json,输入下面的内容。需要注意的是,header里的devkey便是上文中从testlink里生成的,这个值会传给mcp server,不同的人通过copilot操作,会留下他自己的操作痕迹,也会遵循一些权限管理。

{
  "servers": {
    "mcp-testlink": {
      "type": "http",
      "url": "http://127.0.0.1:8000/mcp",
      "headers": {
        "devkey": "testlink api key"
      }
    }
  }
}

而pycharm的mcp.json相当于一个全局的,路径mac上是~/.config/github-copilot/intellij/mcp.json。配置信息中header那里有少许不同。

{
    "servers": {
      "mcp-testlink": {
        "type": "http",
        "url": "http;//127.0.0.1:8000/mcp",
        "requestInit": {
            "headers": {
                "devkey": "testlink api key"
            }
        }
      }
    }
}

配置好mcp.json后,vscode能看到一个start的link,点击一下便能启动链接,而pycharm则是重启后自动链接。

此时在copilot对话中询问testlink的版本则能获取对应信息,如果不启动这个server,copilot知道testlink是什么,但不知道去哪里取,取哪个。

现在最简单的效果看到了,接下来会开始添加testlink内操作的tool。

下一篇:  构建Testlink MCP并集成到Copilot(二)
上一篇:  Playwright与Selenium对比区别

共有0条评论

添加评论

暂无评论