testlink api 操作
Whisper Lv5

testlink可以做很多事情,如API测试参数管理,Excel导入导出,快速模板创建测试用例,集成Jenkins。

TestLink API第三方库:
TestLink-API-Python-client-0.8.0
example 示例

安装

1
pip install TestLink-API-Python-client

获取xmlrpc.php地址

搜索:find -name xmlrpc.php
输出地址为:./opt/bitnami/testlink/lib/api/xmlrpc/v1/xmlrpc.php

搭建的testlink主页地址:http://localhost:8086/index.php

那这里就是

1
http://localhost:8086/lib/api/xmlrpc/v1/xmlrpc.php

不行就试试

1
http://localhost:8086/testlink/lib/api/xmlrpc/v1/xmlrpc.php

1.9.15 获取私人key

点击进入用户的页面,点击生成key按钮,生成成功后会通过邮件发送到该用户邮箱。
搜索:grep -r g_smtp_host *

需要配置testlink配置中的SMTP,否则会报错:LOCALIZE: apikey_cannot_be_reseted_invalid_smtp_hostname。

1.9.20 获取私人key

坑惨了,一直发邮件都没有收到。原来这个版本直接在个人设置中查看就行了。
点击这个小人进入到账号设置,最下面就有。
![[Snipaste_07-07_11-44-19.png]]

获取TestlinkAPIClient对象实例

1
2
3
url = "http://11.12.13.16/lib/api/xmlrpc/v1/xmlrpc.php"
key = "9f5ec9cd058457usdko2191188"
tlc = testlink.TestlinkAPIClient(url, key)

获取基础信息

1
2
3
4
print(tlc.countProjects())
projects = tlc.getProjects()
for project in projects:
print(project)

操作测试用例集

创建用例集

  1. 无测试用例集
  2. 新建项目,未创建测试集,此时获取first level的测试集为空。
  3. 使用创建测试用例集函数createTestSuite时,最后一个参数parentid此时可以不用传输。
  4. 有测试用例集
  5. 如果是创建在项目的根上,最后一个参数parentid此时可以不用传输。
  6. 如果是创建在已有的测试用例集下面,最后一个参数parentid此时要传输为目标用例集的ID。

创建名称相同的用例集

如创建已经存在相同名称的用例集,不会报错,返回0。

创建不重复的用例集,成功后,返回结果如下:

1
2
[{'id': 68219, 'name': '', 'name_changed': False, 'status': True, 
'operation': 'createTestSuite', 'additionalInfo': '', 'message': 'ok'}]

获取用例集

  1. 获取顶级用例集
1
getFirstLevelTestSuitesForTestProject(project_id)

处于顶级用例集下的用例集不会被返回,只返回(一级)标红的用例集。

  1. 获取指定用例集下的用例集
  2. 用例集下只有一个用例集
1
2
用例集1
用例集2

使用tlc.getTestSuitesForTestSuite(testsuite_id)返回的数据结构如下,开头不会多一个key:

1
{'id': '68596', 'details': '', 'name': '用例集2', 'node_type_id': '2', 'node_order': '1', 'parent_id': '68576'}

用例集下有多个用例集

1
2
3
用例集1
用例集2
用例集3

使用tlc.getTestSuitesForTestSuite(testsuite_id)返回的数据结构如下, 前面会多一个id的key:

1
2
3
4
{'68596':
{'id': '68596', 'details': '', 'name': '用例集2', 'node_type_id': '2', 'node_order': '1', 'parent_id': '68576'},
'68673':
{'id': '68673', 'details': '', 'name': '用例集3', 'node_type_id': '2', 'node_order': '2', 'parent_id': '68576'}}

试了下有3个子集的,情况和2个子集相同:

1
2
3
4
5
6
7
8
9
10
用例集1
用例集2
用例集3
用例集4
{'68596':
{'id': '68596', 'details': '', 'name': '用例集2', 'node_type_id': '2', 'node_order': '1', 'parent_id': '68576'},
'68673':
{'id': '68673', 'details': '', 'name': '用例集3', 'node_type_id': '2', 'node_order': '2', 'parent_id': '68576'},
'68674':
{'id': '68674', 'details': '', 'name': '用例集4', 'node_type_id': '2', 'node_order': '3', 'parent_id': '68576'}}

针对以上不同格式做不同处理。

操作测试用例

通过用例ID获取

1
2
3
4
5
6
7
8
 def get_test_case(test_case_id):
test_case = tlc.getTestCase(None, testcaseexternalid=test_case_id)
for i in test_case:
print ("序列", "执行步骤", "预期结果")
for m in i.get("steps"):
print (m.get("step_number"), m.get("actions"), m.get("expected_results"))

get_test_case("auto-10") #要加上项目前缀

注意:这里的用例ID要加上项目前缀,否则获取不到

通过用例集ID获取其下所有用例

1
test_cases = self.tlc.getTestCasesForTestSuite(testsuiteid=suite_id)

如果有其他有用例集,循环获取即可

创建测试用例

源代码如下

1
def createTestCase(self, *argsPositional, **argsOptional):

参数

1
2
3
4
5
6
positional argument位置参数:
testcasename :测试用例名称
testsuiteid :创建在某个测试集,该测试集的ID
testprojectid :测试项目ID
authorlogin :创建人姓名
summary :用例总结

可选参数:

1
2
3
4
5
6
7
8
9
10
steps :步骤,为一个list
preconditions :前置条件
importance
executiontype
order
internalid
checkduplicatedname
actiononduplicatedname
status
estimatedexecduration

创建成功返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
{'operation': 'createTestCase',
'status': True,
'id': 71278,
'additionalInfo':
{'id': 71278,
'external_id': '119',
'status_ok': 1,
'msg': 'ok',
'new_name': '',
'version_number': 1,
'has_duplicate': False,
'external_id_already_exists': False,
'update_name': False,
'tcversion_id': 71279},
'message': 'Success!'}
]

external_id: 用例的ID

步骤预先定义

方法1 使用list

必须是定义好的由字典组成的列表

1
2
3
4
5
6
7
8
steps =
[{'step_number' : 1, 'actions' : "action A" ,
'expected_results' : "result A", 'execution_type' : 0},
{'step_number' : 2, 'actions' : "action B" ,
'expected_results' : "result B", 'execution_type' : 1},
{'step_number' : 3, 'actions' : "action C" ,
'expected_results' : "result C", 'execution_type' : 0}]
newTestCase = self.tlc.createTestCase(........steps=steps)

方法2 使用initStep

1
2
3
4
5
该方法无需传递steps参数,已经预存在了tlc对象中
tlc.initStep("添加一个动作", "期望一个结果", 1)
tlc.appendStep("添加一个动作2", "期望一个结果2", 1)
tlc.appendStep("添加一个动作3", "期望一个结果3", 1)
newTestCase = self.tlc.createTestCase(.......)

自定义字段

这里常用的是版本号,导入Excel的时候使用

自定义关键字

![[Snipaste_07-08_10-52-42.png]]

获取关键字

1
tlc.listKeywordsForTC(testcase_id)

自定义字段

自定义关键字的操作方法,在编辑器中输入custom后,搜出的关键字有如下

第一个猜测是需求关键字。 get开头的获取关键字。 update开头的是更新关键字。

注意: testcaseexternalid一定要写全”au-117”,-符号不能少。

获取用例自定义字段值

1
2
3
4
5
6
getTestCaseCustomFieldDesignValue(
testcaseexternalid="au-117",
testprojectid="68194",
customfieldname='版本号',
version=1
)

这里的version没找到是指哪里,填写1就可以了。

更新用例自定义字段值

1
2
3
4
5
6
tlc.updateTestCaseCustomFieldDesignValue(
testcaseexternalid="au-117",
testprojectid="68194",
version=1,
customfields={"版本号": "6.6"}
)

给用例添加自定义的关键字

先在项目的自定义关键字中添加号要用的关键字(自动添加关键字还不知道怎么添加)

给用例添加上某个关键字,直接用关键字的名称即可

1
2
3
ts = TestLinkOpr("auto")
a = {"auto-68": ["测试关键字B"]}
print(ts.tlc.addTestCaseKeywords(a))

创建项目关键字

研究中。。

搜索到了php添加关键字部分代码

研究不出来

可以导入关键字csv后,加上再导入,保存一份常用的关键字

用xml导入

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>

<keywords>
<keyword name="功能权限"><notes><![CDATA[]]></notes></keyword>
<keyword name="地方都是"><notes><![CDATA[]]></notes></keyword>
<keyword name="数据权限"><notes><![CDATA[]]></notes></keyword>
<keyword name="附件管理"><notes><![CDATA[]]></notes></keyword>
</keywords>