- 文档链接:
https://share.mubu.com/doc/351IsGi27fY 13 密码: hogwarts - 上课演练代码仓库:
https://github.com/debugtalk/hogwarts-20201017 - 实战demo链接:https://github.com/Galaxyfanfan/httprunner_mubu_demo.git
1.下载httprunner
pip3 install httprunner
2. httprunner命令
- 查看版本信息
httprunner -V
- 查看帮助手册
httprunner -h
- 使用模板结构创建一个新项目
httprunner startproject 项目名
- 执行脚本
httprunner run xxx.yml #hrun xxx.yml
hrun xxx.json
- 将 HAR 转换为 YAML/JSON 脚本
har2case xxx.har # pytest
har2case xxx.har -2y # YAML
har2case xxx.har -2j # JSON
- 将YAML/JSON 转换为 pytest 脚本
httprunner make 项目名
3.实战
1.创建一个新项目
使用模板结构创建一个新项目
httprunner startproject mubu
可以看到生成的项目文件结构
2. 获取har文件
利用Charles抓包工具获取接口数据,生成har文件。
剔除掉不必要的接口及文件,将需要的接口选中右键“export”,将接口文件导出为har格式的文件,因为httprunner是基于har这个格式去转换用例的。
将har文件放到maitianServer/har目录下
3.har文件转换为pytest用例
使用pycharm打开maitianServer文件,在终端输入
har2case har/maitian_login.har
将har文件转换为pytest用例,会在当前文件夹下生成一个maitian_login_test.py文件
4.参数关联
将maitian_login_test.py文件拖入到testcases文件夹下,运行,如果没有报错那么继续。查看是否有需要替换的字段,比如上一个接口返回的参数作为下一个接口的传参,可以将这个参数提取出来。例如,创建文件夹会生成一个文件夹id,在后面的接口中有用到。
在py文件里找到相应的接口,添加如下代码:
.extract()
.with_jmespath('body.data.folder.id','folder_id')
获取到id后将其命名为folder_id,后面用到文件夹id的地方都用${folder_id}替换掉
- 也可以替换cookies返回的参数
.with_jmespath("cookies.data_unique_id", "data_unique_id")
.validate()
5.设置全局变量
在py文件的最上面,加上variables设置全局变量
config = Config("testcase description").variables(**{
'phone':'xxx',
'password':'xxx'
}).verify(False)
并在需要的地方做替换
6.删除无用参数
比如请求头里有个字段csrf_token,在接口请求中没有作用,可以删除,使测试用例更简洁。
7.cookies参数关联
当某个数据是cookie响应数据返回的时,也可以将参数进行替换,与普通的参数替换是一样的
.extract()
.with_jmespath('cookies."Jwt-Token"','JwtToken')#若中间有-,可以加""隔离,如cookies."Jwt-Token"
.with_jmespath('cookies.user_persistence','user_persistence')
8.抽取baseurl
在 config里配置base_url
config = (
Config("testcase description")
.variables(**{
'host': 'https://mubu.com',
})
.base_url('${host}')
.verify(False)
)
9.调整校验器
.assert_equal("status_code", 200)
.assert_equal("body.code", 0)
.assert_equal("body.msg", None)
.assert_equal('body.data.next','/list')
10.添加局部变量with_variables
RunRequest("/api/login/submit")
.with_variables(**{
"remember": "true",
"timestamp": "${get_timestamp()}"
})
.post("/api/login/submit")
11.自定义函数
在debugtalk.py文件里构建函数,
- 比如定义一个延时方法
#自定义函数
def custom_sleep(n_secs):
time.sleep(n_secs)
在py文件里需要调用的地方调用
.teardown_hook('${custom_sleep(2)}')
- 定义一个函数(有传参和输出)
例如定义一个函数 输出未读数
在debugtalk.py文件里构建函数get_unreadCount,传入参数response,返回未读数。
from httprunner.response import ResponseObject
def get_unreadCount(response:ResponseObject):
resp_json = response.resp_obj.json()
unreadCount = resp_json["data"]["unreadCount"]
print(f'get_unreadCount {unreadCount}')
return unreadCount
在对应接口下调用。将函数返回值赋值给unreadCount
.teardown_hook('${get_unreadCount($response)}','unreadCount')
12.测试用例分层机制
例子,将登录和创建文件夹用例拆分
新建一个登录py文件,将代码全部复制过去,删除除登录以外的接口,并在配置文件里加入需要export导出的参数,这样在其他py文件里也可以使用
config = (
Config("testcase description")
.variables(**{
'host': 'https://mubu.com',
'phone': 'xxx',
'password': 'xxx'
})
.base_url('${host}')
.export('data_unique_id', 'JwtToken', 'user_persistence')
.verify(False)
)
因为创建文件夹需要在登录的前提下,所以在文件夹用例里引入登录py文件。
from testcases.login_test import TestCaseMubuLogin as MuBuLogin
在接口调用前加入登录的调用,并标记需要export导入的参数,这样以后查找也方便知道在哪个用例里导入的。
teststeps = [
Step(
RunTestCase('login')
.call(MuBuLogin)
.export('data_unique_id', 'JwtToken', 'user_persistence')
),
13.参数化数据驱动
(1) 直接指定参数列表
例子:比如要创建3次文件夹
- 引入需要的库
import pytest
from httprunner import Parameters
- 配置数据驱动
@pytest.mark.parametrize(
'params',Parameters({
'folderTitle':['title-1','title-2','title-3']
}
)
)
def test_start(self, params):
super().test_start(params)
- 在需要用到的地方传入
.with_data({"folderId": "${folder_id}", "name": "${folderTitle}"})
(2) 引用函数生成参数列表
上述例子修改,在debugtalk.py文件里编写函数,如
def gen_random_title():
return f"demo-{random.randint(1, 9999999)}"
def gen_doc_titles(num):
return [gen_random_title() for _ in range(num)]
- 调用函数
@pytest.mark.parametrize(
"param",
Parameters(
{
"folderTitle": "${gen_doc_titles(2)}",
}
)
)
def test_start(self, param):
super().test_start(param)
(3) 引用 CSV 文件
-
配置CSV文件
- 调用
@pytest.mark.parametrize(
"param",
Parameters(
{
"phone-password": "${parameterize(data/accounts.csv)}",
}
)
)
def test_start(self, param):
super().test_start(param)
14.查看测试报告
- 默认 pytest-html 报告形式
hrun har/login.yml --html=login.html
- allure 报告
1.安装
pip install allure-pytest
2.运行
hrun testcases --alluredir=allurereports/
allure serve allurereports
运行成功后自动跳转到报告页面。
15.性能测试
1.安装locust
pip install locust
2.运行
locusts -f testcases/login_test.py
点击链接查看性能测试报告。