杰瑞科技汇

Python如何读取TestLink数据?

核心概念

  1. TestLink XML-RPC API: TestLink 提供了一套基于 XML-RPC 协议的接口,允许外部程序(如我们的 Python 脚本)与其进行交互,你可以通过这个 API 获取测试用例、测试套件、项目信息,创建测试结果,上传附件等等。
  2. xmlrpc.client: Python 标准库中用于实现 XML-RPC 客户端的模块,我们用它来向 TestLink 服务器发送请求和接收响应。
  3. DevKey (开发者密钥): 这是你访问 TestLink API 的“钥匙”,你需要在 TestLink 中为你的用户生成一个 DevKey,并在每次 API 调用时提供它。

第一步:准备工作

在 TestLink 中获取 DevKey

这是最关键的一步。

Python如何读取TestLink数据?-图1
(图片来源网络,侵删)
  • 登录你的 TestLink 账号。
  • 点击右上角的你的用户名,进入 "My Settings"。
  • 在左侧菜单中找到 "API" 选项。
  • 你会看到一个 "Your DevKey" 字段,复制这个字符串。请妥善保管,不要泄露

安装 Python 环境

确保你的系统已经安装了 Python (推荐 3.6+版本),Python 的 xmlrpc.client 是内置库,无需额外安装。

(可选) 安装 requests

虽然 xmlrpc.client 足够,但有些人喜欢用 requests 来处理 HTTP 请求和错误,我们可以用它来构建一个更健壮的客户端,如果你选择这种方式,请安装它:

pip install requests

第二步:连接 TestLink 并获取项目列表

我们先从一个最简单的操作开始:连接到 TestLink 并获取所有可用的项目列表,这能验证我们的连接和 DevKey 是否正确。

使用 Python 内置的 xmlrpc.client

这是最直接的方法。

Python如何读取TestLink数据?-图2
(图片来源网络,侵删)
import xmlrpc.client
# --- 配置信息 ---
# 替换为你的 TestLink 服务器地址
TESTLINK_URL = 'http://your-testlink-server.com/testlink/lib/api/xmlrpc.php'
# 替换为你的 DevKey
DEV_KEY = 'your-devkey-here'
try:
    # 1. 创建一个连接代理对象
    with xmlrpc.client.ServerProxy(TESTLINK_URL) as server:
        # 2. 调用 sayHello 方法,这是一个简单的连接测试
        #    它通常会返回你的 TestLink 版本信息
        print("正在连接 TestLink...")
        response = server.tl.sayHello(DEV_KEY)
        print(f"连接成功! TestLink 版本: {response}\n")
        # 3. 获取所有项目
        print("正在获取项目列表...")
        projects = server.tl.getProjects(DEV_KEY)
        if projects:
            print("项目列表:")
            for project in projects:
                print(f"  - ID: {project['id']}, 名称: {project['name']}")
        else:
            print("未能获取到任何项目。")
except xmlrpc.client.Fault as e:
    # 处理 API 调用失败的情况,DevKey 错误、方法不存在等
    print(f"API 调用失败 (Fault): {e.faultCode} - {e.faultString}")
except xmlrpc.client.ProtocolError as e:
    # 处理协议错误,URL 错误、服务器未响应等
    print(f"协议错误 (ProtocolError): {e.url} - {e.errcode} - {e.errmsg}")
except Exception as e:
    # 处理其他未知错误
    print(f"发生未知错误: {e}")

如何运行:

  1. TESTLINK_URLDEV_KEY 替换成你自己的信息。
  2. 保存为 get_projects.py
  3. 在终端运行 python get_projects.py

如果一切正常,你应该能看到 TestLink 的版本信息和你的项目列表。


第三步:获取测试套件 和测试用例

成功连接后,我们就可以获取更具体的数据了,比如某个项目下的测试套件和测试用例。

import xmlrpc.client
# --- 配置信息 ---
TESTLINK_URL = 'http://your-testlink-server.com/testlink/lib/api/xmlrpc.php'
DEV_KEY = 'your-devkey-here'
# 替换为你想查询的项目名称或ID
PROJECT_NAME = '你的项目名称' 
# 或者使用项目 ID: PROJECT_ID = 1
def get_test_suites_and_cases(server, dev_key, project_id):
    """
    获取指定项目的所有测试套件和其下的测试用例
    """
    try:
        # 获取项目下的所有顶级测试套件
        # 注意:getTestSuitesForTestProject 返回的是树形结构
        test_suites = server.tl.getTestSuitesForTestProject(dev_key, project_id)
        if not test_suites:
            print(f"在项目 ID {project_id} 中未找到测试套件。")
            return
        print(f"\n--- 项目 ID {project_id} 的测试结构 ---\n")
        # 遍历测试套件
        for suite in test_suites:
            print(f"测试套件: {suite['full_path_name']} (ID: {suite['id']})")
            # 获取该测试套件下的所有测试用例
            # getTestCasesForTestSuite 需要测试套件的ID
            test_cases = server.tl.getTestCasesForTestSuite(dev_key, suite['id'], details='full')
            if not test_cases:
                print("  (该套件下没有测试用例)")
                continue
            # 遍历测试用例
            for case in test_cases:
                print(f"  - 测试用例: {case['name']} (ID: {case['id']})")
                # 你可以打印更多细节,
                # print(f"    步骤: {len(case['steps'])}")
                # print(f"    预期结果: {case['expected_results']}")
            print("-" * 30)
    except xmlrpc.client.Fault as e:
        print(f"API 调用失败 (Fault): {e.faultCode} - {e.faultString}")
    except Exception as e:
        print(f"发生错误: {e}")
if __name__ == "__main__":
    try:
        with xmlrpc.client.ServerProxy(TESTLINK_URL) as server:
            # 首先通过项目名称获取项目ID
            projects = server.tl.getProjects(DEV_KEY)
            project_id = None
            for p in projects:
                if p['name'] == PROJECT_NAME:
                    project_id = p['id']
                    break
            if project_id:
                print(f"找到项目 '{PROJECT_NAME}',ID 为: {project_id}")
                get_test_suites_and_cases(server, DEV_KEY, project_id)
            else:
                print(f"错误: 未找到名称为 '{PROJECT_NAME}' 的项目。")
    except xmlrpc.client.ProtocolError as e:
        print(f"协议错误 (ProtocolError): {e.url} - {e.errcode} - {e.errmsg}")
    except Exception as e:
        print(f"发生未知错误: {e}")

这个脚本做了以下几件事:

Python如何读取TestLink数据?-图3
(图片来源网络,侵删)
  1. 连接到 TestLink。
  2. 获取所有项目,并找到我们指定的 PROJECT_NAME 对应的 project_id
  3. 调用 getTestSuitesForTestProject 获取该项目的所有测试套件。
  4. 对每个测试套件,调用 getTestCasesForTestSuite 获取其下的所有测试用例。
  5. 打印出测试套件和测试用例的名称和ID。

第四步:处理更复杂的数据(如执行结果)

除了读取数据,你还可以通过 API 写入数据,例如提交一个测试执行结果。

import xmlrpc.client
import datetime
# --- 配置信息 ---
TESTLINK_URL = 'http://your-testlink-server.com/testlink/lib/api/xmlrpc.php'
DEV_KEY = 'your-devkey-here'
# 替换为你的测试计划ID
TEST_PLAN_ID = 123 
# 替换为你的测试用例ID
TEST_CASE_ID = 456 
# 替换为你的构建ID (版本)
BUILD_ID = 789 
if __name__ == "__main__":
    try:
        with xmlrpc.client.ServerProxy(TESTLINK_URL) as server:
            # 准备测试执行结果数据
            # 这是一个字典,包含提交测试结果所需的所有信息
            execution_data = {
                'testplanid': TEST_PLAN_ID,
                'testcaseid': TEST_CASE_ID,
                'buildid': BUILD_ID,
                'status': 'p',  # 'p' = Passed, 'f' = Failed, 'b' = Blocked, 'n' = Not Run
                'notes': f'由Python脚本自动执行于 {datetime.datetime.now()}',
                'exec_duration': '120' # 执行时长,单位秒
            }
            print(f"正在提交测试用例 {TEST_CASE_ID} 的执行结果...")
            # 调用 reportTCResult 方法
            response = server.tl.reportTCResult(DEV_KEY, execution_data)
            if response == 'OK':
                print("测试结果提交成功!")
            else:
                print(f"测试结果提交失败,服务器返回: {response}")
    except xmlrpc.client.Fault as e:
        print(f"API 调用失败 (Fault): {e.faultCode} - {e.faultString}")
    except Exception as e:
        print(f"发生未知错误: {e}")

常见问题与注意事项

  1. URL 错误: TESTLINK_URL 必须是正确的 XML-RPC 接口地址,通常是 your-domain.com/testlink/lib/api/xmlrpc.php,确保服务器可以访问这个地址。
  2. DevKey 无效或权限不足: 确保你复制的 DevKey 是正确的,并且你的 TestLink 用户账号有权限访问你想操作的项目和测试用例。
  3. SSL 证书问题: 如果你的 TestLink 使用的是 https,并且使用了自签名证书,xmlrpc.client 可能会报错 SSL: CERTIFICATE_VERIFY_FAILED,解决方案是在创建 ServerProxy 时禁用证书验证(不推荐在生产环境使用):
    # 创建一个不验证SSL证书的transport
    transport = xmlrpc.client.SafeTransport()
    transport.user_agent = "Python-TestLink-Client"
    server = xmlrpc.client.ServerProxy(TESTLINK_URL, transport=transport)

    或者更简单地,使用一个不安全的 transport:

    # 警告:不安全,仅用于测试环境
    server = xmlrpc.client.ServerProxy(TESTLINK_URL, allow_none=True, use_datetime=True)
  4. API 版本兼容性: TestLink 的 API 会随着版本更新而变化,如果你使用的某个方法在旧版本中不存在,就会收到 Fault 错误,查阅你所使用的 TestLink 版本的官方 API 文档是最好的做法。
  5. 性能考虑: 一次性获取大量数据(例如一个包含上千个测试用例的测试套件)可能会导致脚本运行缓慢或超时,可以考虑分批获取数据或优化查询逻辑。

使用 Python 与 TestLink 交互的标准流程是:

  1. 获取 DevKey
  2. 使用 xmlrpc.client.ServerProxy 连接到 TestLink 的 API 端点。
  3. 使用 tl. 前缀调用各种 API 方法(如 getProjects, getTestCasesForTestSuite, reportTCResult 等)。
  4. 始终使用 try...except 块来捕获 xmlrpc.client.Faultxmlrpc.client.ProtocolError,以便调试 API 调用中的问题。

希望这份详细的指南能帮助你顺利地在 Python 中读取 TestLink 的数据!

分享:
扫描分享到社交APP
上一篇
下一篇