Bob's Blog

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

返回上页首页

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



前一篇里已经在vscode或者pycharm里能通过mcp server获取内网testlink信息了,现在开始做实际需要的功能。

为了串通前一篇提及到的自动生成的流程,至少需要能获取单个或多个test case以及能创建单个或多个test case。

对于获取信息来说,我们需要提供信息用于搜索查询,这一般有两个方式,一个是通过Context来要求用户输入,一个是把提示词里的信息摘取出来作为关键词。选用后者。

对于通过Context要求输入,可以定义一个数据model,等待并校验用户输入并传入后续的操作中,简单例子是:

from fastmcp import FastMCP, Context
from dataclasses import dataclass


@dataclass
class CaseInfo:
    case_id: str


@app.tool()
async def create_test_case(ctx: Context) -> dict:
    """Retrieve Test Case in testlink."""
    result = await ctx.elicit(
        message="Provide info to get a test case in TestLink: case_id.",
        response_type=CaseInfo
    )
    if result.action == "accept":
        case_info = result.data
    else:
        return {"error": "Cancelled by user."}
    # 这里写获取case信息的步骤,因为没有采用这个方式,所以代码省略

为了能全自动化整个过程,我选择了后者,这样不会打断行为,不用时不时地人为监守。

获取到的test case实际信息非常多,包含了version、执行、维护者等各种信息,对于自动生成脚本的prompts来说并不必要,所以这里最好是筛选一下信息,将有用的返回给Copilot,不做多余干扰。这里选择将name、summary、precondition、steps以固定格式返回。

@app.tool()
async def get_test_case(case_id: str = "undefined") -> dict:
    """Retrieves details of a test case by ID from testlink"""
    try:
        tl = handle_headers().get_client()
        origin_tc = tl.getTestCase(testcaseexternalid=case_id)
        if isinstance(origin_tc, list) and origin_tc:
            origin_tc = origin_tc[0]
        tc = {"Title": origin_tc.get("name", ""),
              "Summary": origin_tc.get("summary", ""),
              "Preconditions": origin_tc.get("preconditions", ""),
              "Steps": [{
                  step["step_number"]: {"actions": step["actions"],
                                        "expected_results": step["expected_results"]
                                        }}
                  for step in origin_tc.get("steps", [])]
              }
        return tc
    except Exception as e:
        return {"error": f"Failed to get test case: {str(e)}"}

对于取多个test case可以是不同目录下的case,也可以是单个test suite下的所有case,方法和上面的类似,调用不同的api。

比如test suite下的所有的case用下面这个,当然要记得取出关键信息,不要存在干扰copilot生成脚本的因素。

cases = tl.getTestCasesForTestSuite(suite_id, True, "full")  # 包含suite下的suite和case

效果类似下图中的:

另外有个需要注意的是,大模型是知道testlink的,但需要让它知道是从哪个testlink找,否则它不一定每次都能调用到mcp,可能会优先去搜索公网上的公开testlink,然后告诉你拿不到。

所以可以在自己的copilot-instructions.md中加上类似下面的信息,明确告知跟testlink有关的任务都指向内网mcp。

## Interact with testlink
- When any task related to testlink such as get test case, create test case, etc., call mcp tool.
- If not provide author login name, ask user to provide it.

 

下一篇:  构建Testlink MCP并集成到Copilot(三)
上一篇:  构建Testlink MCP并集成到Copilot(一)

共有0条评论

添加评论

暂无评论