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

- 登录你的 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
这是最直接的方法。

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}")
如何运行:
- 将
TESTLINK_URL和DEV_KEY替换成你自己的信息。 - 保存为
get_projects.py。 - 在终端运行
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}")
这个脚本做了以下几件事:

- 连接到 TestLink。
- 获取所有项目,并找到我们指定的
PROJECT_NAME对应的project_id。 - 调用
getTestSuitesForTestProject获取该项目的所有测试套件。 - 对每个测试套件,调用
getTestCasesForTestSuite获取其下的所有测试用例。 - 打印出测试套件和测试用例的名称和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}")
常见问题与注意事项
- URL 错误:
TESTLINK_URL必须是正确的 XML-RPC 接口地址,通常是your-domain.com/testlink/lib/api/xmlrpc.php,确保服务器可以访问这个地址。 - DevKey 无效或权限不足: 确保你复制的 DevKey 是正确的,并且你的 TestLink 用户账号有权限访问你想操作的项目和测试用例。
- 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)
- API 版本兼容性: TestLink 的 API 会随着版本更新而变化,如果你使用的某个方法在旧版本中不存在,就会收到
Fault错误,查阅你所使用的 TestLink 版本的官方 API 文档是最好的做法。 - 性能考虑: 一次性获取大量数据(例如一个包含上千个测试用例的测试套件)可能会导致脚本运行缓慢或超时,可以考虑分批获取数据或优化查询逻辑。
使用 Python 与 TestLink 交互的标准流程是:
- 获取 DevKey。
- 使用
xmlrpc.client.ServerProxy连接到 TestLink 的 API 端点。 - 使用
tl.前缀调用各种 API 方法(如getProjects,getTestCasesForTestSuite,reportTCResult等)。 - 始终使用
try...except块来捕获xmlrpc.client.Fault和xmlrpc.client.ProtocolError,以便调试 API 调用中的问题。
希望这份详细的指南能帮助你顺利地在 Python 中读取 TestLink 的数据!
