安装httprunner见文章 安装httprunner
目录
创建HTTPRUNNER项目
# 使用cmd
httprunner startproject demohttp
# 只有有hrun方式的,我失败了,按理hrun是缩写可以
# 还有hrun --startproject demohttp 这个查询了我使用的是3.X版本的貌似不需要--
生成的目录文件为:
使用pyacharm打开项目
如果发现导入httprunner异常,检查安装httprunner安装情况以及到pyacharm的setting查看一下
获取har文件,并转换未yaml文件
这里建议将har放到har目录
转化之后为:
将生成的yaml文件复制到testcases目录下,这里注意一下get请求和post、put、delete请求在request部门差异是get使用params,其他的使用json。注意对比一下
执行yaml文件
在pycharm的terminal窗口执行,会自动生成一个.py文件,这个文件也可单独执行
hrun testcases/login.yml --log-level debug
# --log-level debug 日志级别
# --log-level info
查看结果:
查看测试报告
#方式一:HTML 测试报告,缺点用 hrun 运行生成的报告会出现一大堆的报错: OSError: [WinError 6] 句柄无效。并且无法显示 request 和 response 内容。
#httprunner 安装之后自带 pytest-html 插件,当你想生成 HTML测试报告时,可以添加命令参数--html
hrun testcases/login.yml --html=reports\report.html
# 或者hrun testcases/login.py --html=reports\report.html
# 强烈建议在生成py文件之后使用这个
pytest testcases --html=reports\report.html --self-contained-html
# 方式二:allure report 主要看下文附件一安装allure
hrun testcases/ --alluredir=reports/ --clean-alluredir
# 建议使用pytest运行,因为在3.14版本中使用hrun命令存在bug不能在报告中查看日志
pytest testcases/ --alluredir=reports/ --clean-alluredir
allure serve reports
# 这里会自动弹出浏览器,360浏览器注意使用极速模式
allure报告效果图
将yaml转换成py文件
hmake testcases
结合locust进行页面性能测试
安装locus
# pip install locustio 这个基本歇菜 安装不了
# 解决方案是:就是安装最新(发布前)的locust
pip install -U setuptools
pip install -U --pre locustio
# 注意 注意 一下版,我后期单独学习locustio使用了下面方式安装,版本不一致会有问题。还是是上面的安装
pip install locustio==0.11.0 -i https://pypi.douban.com/simple
检验安装是否成功
locust -V
执行命令
locusts -f testcases/login.yml
# 运行命令:locusts -f 文件路径 --processes
# (在 Locust 中需使用多核处理器的能力,--processes 参数,可以一次性启动 1 个 master 和多个salve。若在 --processes 参数后没有指定具体的数值,则启动的 slave 个数与机器的 CPU 核数相同。
在浏览器当中访问 http://localhost:8089/
Number of users to simulate:并发用户数
Hatch rate (users spawned/second):每秒产生用户数
Host : 主机地址
点击Start swarming,开始压测
参数说明
生成图表
附件一 安装allure
pip3 install allure-pytest
pip3 install "httprunner[allure]"
一旦allure-pytest 准备好,以下参数就可以与 hrun/pytest命令一起使用:
命令 | 功能描述 |
---|---|
--alluredir=DIR | 生成 allure 报告到指定目录 |
--clean-alluredir | 如果指定目录已存在则清理该文件夹 |
--allure-no-capture | 不要将 pytest 捕获的日志记录(logging)、标准输出(stdout)、标准错误(stderr)附加到报告中 |
要使 allure
侦听器能够在测试执行期间收集结果,只需添加--alluredir选项,并提供指向存储结果的文件夹路径。
附件二 高价(参数化)
转自 网络 3.X有部分修改,见下图红色注意部分
无论在日常接口测试,还是性能测试,都对数据有要求,特别是性能测试,需要大量数据,这个时候就需要对传递的参数进行参数化了。
httprunner中支持的参数化方法有:csv文本、自定义函数
1、使用CSV文本进行参数化
在脚本同级目录下新建csv文件,打开存入需要的数据,保存
引用: 增加一个parameters参数,通过调用${P(***.csv)}方法来读取csv文本中的数据,也是使用$+变量名引用参数。
值得注意的是,通常来说,一个CSV文件中会放多列数值,那么这个时候,各列参数通过“-”连接来读取参数,如:要传postid1、name两列参数,这样写就可以postid1-name: ${P(postid.csv)}
下图新版3.X不支持在用例step当中配置,一般配置在config,下图当中的参数要修正下图格式,因为是截图,就不修正了(这是自己实际操作当中发现的坑)
config: # 3.X csv要在这里
name: test kuaidi100 api
parameters:
postid1: ${P(postid.csv)} # 一个参数没有 -
yml格式用例既可以使用相对路径,也可以用绝对路径 pytest建议用绝对路径,相对路径可能会报错
(注意参数配置方式,见上面的修正)
运行提示:
“Ran 4 tests in 2.076s”,good。因为csv中有4个参数,用例也运行了4遍,查看log,4个参数都是csv里面的,而且是顺序的。
注意:csv多个参数列呢,下图方式-间隔
user-pwd
2、使用自定义函数进行参数化
还是在脚本下,新建debugtalk.py文件,注意,这个文件名字就不能随便取啦,固定的
注意:debugtalk.py
中自定义的函数生成参数列表,生成的参数列表必须为 list of dict 的数据结构,个人觉得得看你作为很么参数去传递,如果在parameters中,建议是list。(dict没有去实验)
代码:
与csv引用类似,脚本中使用${get_postids(5)}来引用函数,5表示想要获取的参数个数
自己的扩展:系统存在鉴权问题,是不是可以把获取token放在debugtalk里面,自己尝试了一下,使用的是函数 封装,然后在yml文件的全局变量设置variables,使用类没有成功,原因未找出
config:
name: testcase XX系统
base_url: 128.6.8.0:33
verify: false
# parameters:
# data_a: ${abc} # 用例参数化
variables:
token: ${get_token()} #token: ${get_token()} # 获取公共方法token
teststeps:
- name: 添加AA
request:
headers:
Content-Type: application/json;charset=UTF-8
Authorization: $token
json:
asagesntId: ''
celsdldphone: ''
tdeptssId: '0022111'
method: POST
url: /er/usege/er
validate:
- eq:
- status_code
- 200
- eq:
- content.resultCode
- 0
- eq:
- content.message
- 添加成功
3、使用上一请求返回作为参数传递
使用extract
- config:
base_url: "http://192.168.1.100:8093"
- test:
name: 用户名密码正确
api: api/login.yaml
variables:
password: '800001'
username: '800001'
extract: # 这里就是获取上一接口返回
- cookie: cookies.JSESSIONID
validate:
- eq: ["content.success", True]
- test:
name: 用户名存在,密码错误
api: api/login.yaml
variables:
password: '800001'
username: '800002'
vercode: $cookie # 这里就是使用
validate:
- eq: ["content.success", False]
另一种方式:
# 区别在新增第3 4 行,修改第12行
# export: # (早期版本用的output)指定导出的测试用例会话变量,把变量暴露出来,设置为全局变量
- config:
base_url: "http://192.168.1.100:8093"
export:
- cookie
- test:
name: 用户名密码正确
api: api/login.yaml
variables:
password: '800001'
username: '800001'
extract: # 这里就是获取上一接口返回
cookie: cookies.JSESSIONID
validate:
- eq: ["content.success", True]
- test:
name: 用户名存在,密码错误
api: api/login.yaml
variables:
password: '800001'
username: '800002'
vercode: $cookie # 这里就是使用
validate:
- eq: ["content.success", False]
4、py文件测试用例引用前面一个用例(call)
RunTestCase(name)
- RunTestCase 在一个步骤中用于引用另一个测试用例调用。
- name RunTestCase 的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。
- .with_variable() 与 RunRequest 的.with_variables 一样,定义变量
- .call() 指定引用的测试用例类,需先导入这个类。
- .export() 指定要从引用的测试用例导出的会话变量名称。导出的变量可以被后续的测试步骤引用。
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from testcases.test_login_test import TestCaseTestLogin as TestLogin
class TestCaseLoginUserinfo(HttpRunner):
config = Config("logincase").base_url("http://127.0.0.1:8000").export(*["token"])
# 重点是这里,但是这个使用yaml是否支持yaml配置不清楚,来自网络方法
teststeps = [
Step(RunTestCase("step1 login") # 导入模块对应的步骤
.call(TestLogin) # 这个是导入的模块名
.export(*["token"])), # 要使用的变量
Step(
RunRequest("step2 get user info")
.get("/api/v1/userinfo/")
.with_headers(
**{
"Content-Type": "application/json",
"User-Agent": "python-requests/2.18.4",
"Authorization": "Token $token",
}
)
.validate()
.assert_equal("status_code", 200)
.assert_equal('headers."Content-Type"', "application/json")
.assert_equal("body.code", 0)
.assert_equal("body.data[0].mail", "283340479@qq.com")
),
]
if __name__ == "__main__":
TestCaseLoginUserinfo().test_start()
请参考官方中文教程网站:http://cn.httprunner.org/ 源码挪步:https://github.com/httprunner/httprunner