初始化与清除机制
在HttpRunner3.x中实现初始化与清除机制的方式是采用hook 机制,可以在请求前和请求后调用钩子函数。
步骤层面
钩子函数用法
1.定义钩子函数
debugtalk.py
def hook_setup():
with open('setup.txt','w',encoding='utf-8') as f:
f.write('执行初始化')
def hook_teardown():
with open('teardown.txt', 'w', encoding='utf-8') as f:
f.write('执行清除')
hook_setup
和hook_teardown
两个函数的作用是,在执行函数的时候,将文字写入到文件中
2.测试步骤引用钩子函数
demo_login.yml
config:
name: 测试用例
base_url: http://127.0.0.1:8080
variables: ${login_variables()}
teststeps:
- name: 用户名密码登录
setup_hooks:
- ${hook_setup()}
teardown_hooks:
- ${hook_teardown()}
request:
method: POST
url: /api/mgr/loginReq
headers:
Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
cookies:
csrftoken: 1esSz9MFIZRpjAmZrvVLrL9NdiXbNpXU
data:
username: $user #引用变量 也可以写成${变量名}
password: $psw
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- $code
输入hrun
命令执行测试用例 hrun .\testcases\demo_login.yml
。
通过查看日志文件可以发现,调用request请求前,执行了hook_setup
函数,返回response结果后,执行了hook_teardown
函数。在项目目录下,生成了setup.txt
和teardown.txt
两个文件并写入了文字内容
实战案例
提取cookie信息
进行接口进行测试,大多接口都会需要带上登录成功后的cookie信息
login.yml
config:
name: 测试用例
base_url: http://127.0.0.1:8080
variables:
username: auto
password: sdfsdfsdf
export: # 将测试步骤中提取的变量cookie分享出去
- cookie
teststeps:
- name: 用户名密码登录
request:
method: POST
url: /api/mgr/loginReq
headers:
Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
cookies:
csrftoken: 1esSz9MFIZRpjAmZrvVLrL9NdiXbNpXU
data:
username: $username #引用变量 也可以写成${变量名}
password: $password
extract: #提取当前步骤变量
cookie: cookies.sessionid
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- 0
通过extract
,提取登录成功后cookies里的sessionid
,并将其赋予变量cookie
,再通过export
将测试步骤中提取的变量cookie
分享出去
add_course.yml
config:
name: 添加课程
verify: false
base_url: http://127.0.0.1:8080
export: # 将login.yml里提取的cookie变量和add_course.yml里提取的course_id分享出去
- course_id
- cookie
teststeps:
- name: 登录-引用login.yml
testcase: testcases/login.yml #引用login.yml测试用例文件
- name: 添加课程
request:
method: POST
url: /api/mgr/sq_mgr/
headers:
Content-Type: "application/x-www-form-urlencoded"
cookies:
sessionid: ${cookie} # 将login.yml里提取的cookie变量引入
data:
action: add_course
data: '{ "name": "高中化学", "desc": "高中化学课程", "display_idx": "1"}'
extract:
course_id: body.id
validate:
- eq: [ 'status_code',200, ]
- eq: [ 'body.retcode',0 ]
输入hrun
命令执行测试用例 hrun .\testcases\add_course.yml
。
通过日志文件可以发现,添加课程用例中,将login.yml
里提取的cookie
变量引入,执行sq_mgr
接口成功,返回body中返回了课程id。同样的方法,通过extract
,提取添加课程接口中body里的id
,并将其赋予变量course_id
,再通过export
将测试步骤中提取的变量course_id
分享出去
通过钩子函数清理数据
debugtalk.py
def delete_course(_id, sessionid):
url = 'http://http://127.0.0.1:8080/api/mgr/sq_mgr/'
payload = {
"action": "delete_course",
"id": _id
}
cookies = {
'sessionid': sessionid
}
resp = requests.delete(url, data=payload, cookies=cookies)
return resp.json()
update_course.yml
config:
name: 修改课程
verify: false
base_url: http://127.0.0.1:8080
export:
- course_id
- cookie
teststeps:
- name: 添加课程
testcase: testcases/add_course.yml #引用add_course.yml测试用例文件
- name: 修改课程
request:
method: PUT
url: /api/mgr/sq_mgr/
headers:
Content-Type: "application/x-www-form-urlencoded"
cookies:
sessionid: ${cookie} # 将login.yml里提取的cookie变量引入
data:
action: modify_course
id: ${course_id} # 将add_course.yml里提取的course_id变量引入
newdata: '{ "name": "初中计算机", "desc": "初中计算机课程", "display_idx": "1"}'
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- 0
teardown_hooks: # 使用钩子函数清理数据
- ${delete_course($course_id,$cookie)}
输入hrun
命令执行测试用例 hrun .\testcases\update_course.yml
。
通过日志文件可以发现,修改课程用例中,将add_course.yml
里提取的cookie
和course_id
变量引入,执行sq_mgr
接口成功,修改了课程信息。最后,使用钩子函数调用debugtalk.py
里的delete_course
函数清理数据,将课程信息删除
用例层面
HttpRunner3.x技术层面未支持用例hook,但可以通过变通的方式实现初始化与清除
比如将初始化清除的步骤写进测试用例,在测试步骤中引用测试用例即可
初始化用例文件 setup.yml
config:
name: 初始化
base_url: http://127.0.0.1:8080
export: # 将测试步骤中提取的变量cookie分享出去
- cookie
teststeps:
- name: 用户名密码登录
request:
method: POST
url: /api/mgr/loginReq
headers:
Content-Type: "application/x-www-form-urlencoded; charset=UTF-8"
cookies:
csrftoken: 1esSz9MFIZRpjAmZrvVLrL9NdiXbNpXU
data:
username: auto
password: sdfsdfsdf
extract: #提取当前步骤变量
cookie: cookies.sessionid
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- 0
清除用例文件 teardown.yml
config:
name: 清除
base_url: http://127.0.0.1:8080
teststeps:
- name: 退出登录
request:
method: GET
url: /api/mgr/logoutreq
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- 0
测试用例部分 demo.yml
config:
name: 列出课程
verify: false
base_url: http://127.0.0.1:8080
teststeps:
- name: 初始化
testcase: testcases/setup.yml #引用初始化测试用例文件
- name: 列出课程
request:
method: GET
url: /api/mgr/sq_mgr/
headers:
Content-Type: "application/x-www-form-urlencoded"
cookies:
sessionid: ${cookie} # 将setup.yml里提取的cookie变量引入
params:
action: list_course
pagenum: 1
pagesize: 20
extract:
course_id: body.retlist[0].id # 提取课程id
validate:
- eq: [ 'status_code',200, ]
- eq: [ 'body.retcode',0 ]
- name: 清除
testcase: testcases/teardown.yml #引用清除测试用例文件