HttpRunner 自动化+性能测试工具
1:接口测试工具HttpRunner httprunner中文文档:https://ontheway-cool.gitee.io/httprunner3doc_cn/user_guide/run_load_test/
通过Djiango将HttpRunner功能集成到平台里面,去做接口用例的管理
其他功能:
用户管理
权限管理
登录
Jira集成等:第三库将其他系统的功能集成到项目里
HttpRunner简介:
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,用户通过编写YAML或JSON文档即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求
用例只需要维护一份YAML/JSON脚本就可以了,不需要编写接口代码,执行的时候自动转成代码执行,通过pytest框架执行
HttpRunner设计理念是不重复造轮子,底层基于Request和Pytest实现接口自动化
HttpRunner的特征是:
支持以YAML或JSON
格式定义测试用例
支持响应验证
支持初始化清除机制
支持套件级别的用例管理
支持Pytest命令(hrun底层封装的pytest) h3新特性
支持allure生成测试报告 h3新特性
支持性能测试(底层Locust)
HttpRunner版本对比:
目前使用率较广的版本是HR2.x,和HR3.x
HttpRunner3.x是HttpRunner2.x重构之后的一个版本。在实现思路和命令上都具有显著的差异。这里我们先简要的描述下差异,选择合适自己项目的版本来学习和使用
2的报告使用的jinja2这个模板引擎,把模板转换成HTML页面,通过模板引擎,Flask使用的模板引擎就是 jinja2
3可以使用pytest+allure结构的报告
解释:
2.x里支持yml和json 3.x增加了pytest格式,并且推荐使用
2.x的命令行主要是hrun系列 3.x的命令行复用了pytest,也可以直接用pytest xxx
2.x报告使用独立模板 3.x报告使用pytest-html,pytest-allure
2.x使用3个层级来区分请求、case、参数化 3.x主要分为请求和引用case
2.x的特点是,编写case可以完全脱离代码基础。但是需要学习hrun数据规则
3.x的特点是,极大的精简了项目规模。写case的时候有自动补全,降低了学习成本。但是组合case的时候相对抽象
HttpRunner3.x安装与使用:python开发的一个库,需要python3.6以上
安装:pip install httprunner==3.1.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
验证:httprunner -V 或者 hrun -V
安装HttpRunner后,以下5个命令会写入系统环境变量配置:
httprunner:主命令,用于所有功能
hrun:指令httprunner run的别名,用于运行YAML/JSON/Pytest 测试用例。
hmake: 指令httprunner make的别名,将YAML/JSON用例转换成pytest用例。
har2case:指令httprunner har2case的别名,将HAR文件转换成 YAML/JSON 用例。
locust: 利用locust 运行性能测试
查看httprunner版本:
hrun -V
查看可以使用的功能选项,运行
httprunner -h
djenv虚拟环境安装 httprunner
djenv\Scripts\activate.bat:激活虚拟环境
pip install httprunner==3.1.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
输入:hrun -V 提示:ImportError: cannot import name 'soft_unicode' from 'markupsafe' (c:\users\autel\desktop\course_python\djenv\lib\site-packages\markupsafe\__init__.py)
解决方式:参考链接:https://blog.csdn.net/weixin_45438997/article/details/124261720
python -m pip install markupsafe==2.0.1
再次输入: hrun -V 打印 3.1.6 ok
2:httprunner方式1.录制生成用例 http请求抓包
1:fiddler抓包,生成har文件,放到har目录中,File > Export Sessions > Selected Sessions > httparchive v1.2
2:转化成测试用例文件
3:执行测试用例

选择如下格式:这是第一步Fildder抓包生成 har 文件
2:生成pytest用例:
HttpRunner 3.0.7版本开始,har2case将HAR文件默认转换成pytest
har2case xxx.har
生成YAML文件
har2case -2y xxx.har
生成Json文件
har2case -2j xxx.har
xxx.har:这个文件查看起来本质上是一个json格式的文件
把这个 har 文件转换成测试用例文件(Ymal或者Json)
3:方式2.编写测试用例
hr3支持 python代码,yaml, json 三种格式用例,以yml格式为例,只需要遵循一定规则,就可以写出符合hr3标准的用例
如下:
config: # config是测试用例的配置,
name: 登录测试用例
parameters:
username-password-code: ${get_login_data()} verify: false
base_url: http://120.55.190.222:7080
export:
- cookie
teststeps: # 测试用例的步骤
-
name: 用户名密码登录
request:
url: /api/mgr/loginReq
data:
username: $username
password: $password
method: POST
extract:
cookie: cookies.sessionid
validate:
- eq:
- status_code
- 200
- eq:
- body.retcode
- $code
4:执行 测试用例
将该文件保存为case1.yml, 进入该文件所在目录运行测试用例
hrun case1.yml
httprunner使用的是pytest执行的用例
执行json用例文件的时候生成了一个 listcourse_test.py 测试py文件,是python语法,里面的类继承了 HttpRunner 库
采用了httprunner里面的结构和api,这个 listcourse_test.py 文件可以直接使用 pytest来执行
(venv) C:\Users\Autel\Desktop\course_django\httprunner_test>pytest listcourse_test.py
不能使用pytest执行json和yml格式的用例,pytest只能运行python,httprunner安装后自动安装pytest和request
hrun 运行yml等其他格式的文件,先根据格式的信息生成一个 py格式的测试文件,然后再通过 pytest去执行这个py 格式的测试文件
hurn 执行yml和json文件的用例 原理类似
3:httprunner手写用例
HR运行原理:
postman Curl等都是录制接口的一个工具,生成接口信息方式,这些类型的文件都可以转化成json文件,也可以转化成yaml文件,真正运行是根据yaml和json
转化成python1格式的文件然后使用pytest执行python文件
HR根据一个模型信息校验测试用例文件结构,json或者yaml格式不符合模型那么校验失败,不转了,后面使用测试平台转化成pytest或者python格式的文件需要使用这个模块
校验json或者yaml数据是否合法的
可以直接调用 models pydantic模块进行校验达成功能
httprunner测试用例结构:
config: 每个测试用例必须有这个部分,可以配置用例
name:测试用例的名称
variables:一些变量
verify:
teststeps:测试步骤相关信息 -:列表类型
name:测试步骤名称
request:一个请求数据,HR工具里主要做接口测试,测试步骤主要针对接口,接口测试需要发送接口信息放到request数据结构里
cookies headers method paramas url validate(检查响应数据)
validate:
-eq:检查什么字段是否等于什么
一个测试用例必须有这样一个结构,HR这里目前一个文件只有一个用例
HttpRunner v3.x 支持3种用例格式: pytest 、 YAML 和 JSON
pytest 、 YAML 和 JSON 格式的测试用例完全等价,包含的信息内容也完全相同。
对于熟悉 YAML 格式的人来说,编写维护 YAML 格式的测试用例会更简洁,但前提是要保证 YAML格式没有语法错误
在httprunner中,测试用例组织主要基于三个概念: 一个测试用例对应一个yaml或者json文件
测试用例集(testsuite): 对应一个YAML/JSON/Python文件,包含单个或多个测试用例文件
测试用例(testcase): 对应一个YAML/JSON/Python文件,包含单个或多个测试步骤
测试步骤(teststep): 对应YAML/JSON/Python中 teststeps下的一个节点,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、检验结果等
对于单个YAML文件来说,数据存储结构为 list of dict 的形式,其中可能包含一个全局配置项(config)和若干个测试步骤
具体地:
* config: 作为整个测试用例的全局配置项
* 测试步骤:对应单个测试步骤(teststep),测试用 例存在顺序关系,运行时将从前往后依次运行各个测试步骤
testcase对应的YAML格式如下所示:
config: name(必须):测试用例的名称,将在log和报告中展示
base_url(可选):测试用例中的通用(路径)Host,例如https://postman-echo.com。如果base_url被指定,测试步骤中的url只能写相对路径。当你要在不同环境下测试时,这个配置非常有用
后面具体url改动就不需要改了,base_url和path做一个拼接
variables(可选的):定义的全局变量,作用域为整个用例。每个测试步骤都可以引用config variables。也就是说,step variables 优先级高于 config variables
parameters(可选的):全局参数,用于实现数据化驱动,作用域为整个用例
verify(可选的):指定是否验证服务器的TLS证书。如果我们想记录测试用例执行的HTTP流量,这将特别有用,因为如果 没有设置verify或将其设置为True,则会发生SSLError
看测试的是否是HTTPS,接口是HTTPS请求需要通过SSL认证,就需要设置verify,指定https证书
export(可选的):指定输出的测试用例变量。将每个测试用例看作一个黑盒,config variables是输入变量,config export是输出变量。
当一个测试用例在另一个测试用例的步骤中被引用时,config export将被提取并在随后的 测试步骤中使用,获取一个测试用例运行的结果给其他测试用例使用
显示将变量输出,导出该用例当中的变量可以被其他用例使用---输出
teststeps: 一个列表里包含多个步骤,一个元素就是一个测试步骤,每个测试步骤包含各种数据
name(必须):name用来定义测试步骤 name,将出现在log和测试报告中 步骤名称
variables(可选的):不定义可以使用config里定义的变量,单独步骤里定义的变量单独步骤使用,作用域范围不同
测试步骤中定义的变量,作用域为当前测试步骤。如果想在多个测试步骤中共享变量,需要在config variables中定义,测试步骤中的变量,会覆盖config variables中的同名变量
优先级高于 config 里的variables
request(必须):
METHOD(必须):设置http方法,支持RestFul中的所有http方法(GET/POST/PUT/PATCH/DELETE/) ,相当于requests.request 中的method 大小写不敏感
URL(必须):请求路径,如果config里没有写base_url这里需要写完整的url,如果config里写了这里只需要写一个拼接的路径
设置Url,如果base_url在config中设置了,url只能是相对路径部分。相当于requests.request 中的url
PARAMS(可选):设置Url的query,相当于requests.request 中的params。 get请求的参数,post请求不需要这个而是使用data或者json
from-urlencode表单类型传 data,json类型的使用json参数
HEADERS(可选):设置请求的headers,相当于requests.request 中的headers。
COOKIES(可选):设置Http请求的cookies,相当于requests.request 中的cookies。
DATA(可选):设置http请求的Body,相当于requests.request 中的data。
JSON(可选):设置http请求json格式的body,相当于requests.request 中的json。
extract(可选):从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过 $token的形式进行引用 提取响应数据
原理:利用jmespath 提取Json response body的内容
retcode: body.retcode # 从响应体提取变量: body.属性.xxx
cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx
cookie: cookies.sessionid # 从cookies提取变量
结合接口文档
validate(可选):测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验
原理:用jmespath提取Json response的内容,并进行断言校验
格式:- 运算符: [jmespath表达式, expected_value, message] 列表格式
运算符包括:
equal: 等于
contained_by: 实际结果是否被包含在预期结果中
contains: 预期结果是否被包含在实际结果中
endswith: 以...结尾
greater_or_equals: 大于等于
greater_than: 大于
length_equal: 长度等于
length_greater_or_equals: 长度大于等于
length_greater_than: 长度大于
length_less_or_equals: 长度小于等于
length_less_than: 长度小于
less_or_equals: 小于等于
less_than: 小于
not_equal: 不等于
regex_match: 字符串是否符合正则表达式匹配规则
startswith: 以...开头
string_equals: 字符串相等
type_match: 类型是否匹配
jmespath: jmespath表达式,详见JMESPath Tutorial
expected_value: 指定期望值或变量,也可以调用方法
message(optional): 用于描述断言失败原因
hooks(可选):初始化和清除的
setup_hooks函数放置于debugtalk.py中,并且必须包含三个参数:
method: 请求方法,比如:GET,POST,PUT url: 请求URL kwargs: request的参数字典
teardown_hooks函数放置于debugtalk.py中,并且必须包含一个参数: resp_obj: requests.Response实例
一个简单的 HR 测试用例模板: config: name: case001_login base_url: http://localhost variables: username: auto export: - cookie # cookie这个变量在用例级别导出来,可以给其他yml用例文件使用 :用例级别的导出 teststeps: - # step 1 name: 登录获取token request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: auto password: sdfsdfsdf extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 步骤级别的导出 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx 这里得到的是全部的cookie值 cookie: cookies.sessionid # 从cookies提取变量,获取 sessionid 的值 validate: - equal: - $retcode - 0 - equal: - body.retcode - 0 - # step 2 name: 列出课程 request: method: GET url: /api/mgr/sq_mgr/ params: action: list_course pagenum: 1 pagesize: 20 cookies: sessionid: $cookie extract: total: body.total retcode: body.retcode validate: - equal: - $total - 2 - equal: - $retcode - 0
测试步骤引用其他用例:引入上面的一个测试用例 config: name: 引用测试 base_url: http://localhost teststeps: - name: 引用demo1 testcase: day1/demo1_login_list.yml # 引用其他用例 相对路径规则:执行时候命令行所处的路径 - name: setp2_list_course request: method: GET url: /api/mgr/sq_mgr/ params: action: list_course pagenum: 1 pagesize: 20 cookies: sessionid: $cookie # 获取的step1里面的cookie,step1引入的是一整个步骤 extract: # 引用测试用例模式无需写extract total: body.total retcode: body.retcode validate: - equal: - $total - 2 - equal: - $retcode - 0
4:测试用例集(测试套件)
测试用例集(testsuite)的格式如下所示: config: name: test suite demo variables: # testsuite config variables foo1: config_bar1 foo2: config_bar2 expect_foo1: config_bar1 expect_foo2: config_bar2 base_url: "https://postman-echo.com" testcases: - name: test case 1 variables: # testcase variables uid: 1000 var_c: ${gen_random_string(5)} parameters: uid: [101, 102, 103] var_c: ["demo1", "demo2", "demo3"] testcase: /path/to/testcase1
5:HttpRunner简单的一个增删改查示例
# 登录获取 sessionid config: name: login_demo base_url: http://localhost variables: ${login_variables()} #引用debugtalk中的函数 # parameters: # account: # - auto # - auto2 # psw: # - sdfsdfsdf # - sdfsdf # code: # - 0 # - 1 # 关联形式参数1-参数2-参数3: [[参数组1],[参数组2]...] # account-psw-code: # - ['auto','sdfsdfsdf',0] # - ['auto1','sdfsdf',1] export: - cookie teststeps: - # step 1 name: 登录 request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: $account password: $psw extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx cookie: cookies.sessionid # 从cookies提取变量 validate: - equal: - $retcode - $code
# 新增课程 config: name: 增加课程 base_url: ${ENV(base_url)} export: - course_id # 暴露出课程id - cookie teststeps: - #step1 引用login_case.yml 先需要登录认证 name: 登录 testcase: day2/login_case.yml - #step2 name: 发送增加课程请求 setup_hooks: - ${before_add_course($request)} teardown_hooks: - ${after_add_course($response)} variables: name: 小学语文 desc: 语文课 idx: 3 # ${add_course_variables()} teststep中不支持从debugtalk中读取函数返回值 request: url: /api/mgr/sq_mgr/ method: POST data: action: add_course data: # '{"name":"${name}","desc":"${desc}", "display_idx":"${idx}"}' 这里是json串,一个python字符串,而不是字典,如左这样加就行 name: $name desc: $desc display_idx: $idx cookies: sessionid: $cookie extract: course_id: body.id # 提取 创建的课程 id 给后面删除使用 validate: - equal: - body.retcode - 0
# 修改课程 config: name: 修改课程 base_url: http://localhost export: - course_id - cookie teststeps: - name: 登录并添加课程 testcase: day2/demo1_add_course.yml - name: 修改课程 request: method: PUT url: /api/mgr/sq_mgr/ data: action: modify_course id: $course_id newdata: '{"name":"python教学","desc":"测试开发课程", "display_idx":"1"}' cookies: sessionid: $cookie validate: - equal: - body.retcode - 0
# 删除课程 config: name: 删除课程 base_url: http://localhost teststeps: - name: 登录、添加课程并修改 testcase: day2/demo2_update_course.yml - name: 删除课程请求 request: method: DELETE url: /api/mgr/sq_mgr/ data: action: delete_course id: $course_id cookies: sessionid: $cookie validate: - equal: - body.retcode - 0
6:HttpRunner 用例变量 之 配置变量
httprunner中,可以用变量替换测试步骤中的某些值。
变量按照类型划分有:配置变量(config variables) 环境变量(env variables)和 参数变量(parameter variables)
按照作用域划分有:测试步骤变量(step variables) 和 全局配置变量(config variables),步骤优先级大于用例优先级
配置变量(config variables):在config中定义的变量为用例全局变量作用域为当前用例 config: name: 登录测试用例 verify: false base_url: http://120.55.190.222:7080 variables: # variables这里定义变量 username: auto #定义变量 password: sdfsdfsdf
teststeps: - name: 用户名密码登录 request: url: /api/mgr/loginReq data: username: $username #引用变量 也可以写成${变量名} password: $password method: POST extract: #提取当前步骤变量 cookie: cookies.sessionid validate: - eq: - status_code - 200 - eq: - body.retcode - 0
config和teststeps里都有一个 variables 数据结构来定义变量
定义在不同位置作用域不同,config作用域大
teststeps定义的变量只能被当前步骤引用
config定义的变量可以被当前测试用例所有步骤引用
相同名字的变量 teststeps 里面的变量优先级更高
debugtalk.py 文件中定义函数返回键值对变量 如果变量需要从其他数据源读取,那么可以在 debugtalk.py 中定义函数返回键值对变量 debugtalk.py文件内容: def login_variables(): return {'user':'auto','psw':'sdfsdfsdf',"code":0} yaml测试用例文件内容: config: name: 登录测试用例 verify: false base_url: http://120.55.190.222:7080 variables: ${login_variables()}
teststeps: - name: 用户名密码登录 request: url: /api/mgr/loginReq data: username: $user #引用变量 也可以写成${变量名} password: $psw method: POST extract: #提取当前步骤变量 cookie: cookies.sessionid validate: - eq: - status_code - 200 - eq: - body.retcode - $code
6:用例变量 debugtalk.py 文件使用的实例
# debugtalk.py 文件内容如下 # 一个测试用例可以使用一个函数取维护请求的数据 # 定义脚本,函数可以被用例文件引用 import json import requests def login_variables(): # 读取数据库或者EXCEL或其他文件... return {'account': 'auto', 'psw': 'sdfsdfsdf', 'code': 0} def add_course_variables(): return {"name": "中学数学", "desc": "微积分", "idx": "4"} 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('执行清除步骤') def before_add_course(request): print('####$$$$$$$##########$$$$$$$$$$$########') print(request) data = request['data']['data'] # 从原请求信息获取入参 # data['name']='计算机课程_steup' # data['desc']='steup_test' # data['display_idx']='100' request['data']['data'] = json.dumps(data) # 覆盖掉原请求数据 def after_add_course(response): print(response.json) course_id = response.json['id'] # 完成以后根据id取删除该课程 requests.delete('http://localhost/api/mgr/sq_mgr/', data={'action': 'delete_course', 'id': course_id})
# login_case.yml 文件引入 debugtalk.py 文件中定义的变量 config: name: login_demo base_url: http://localhost variables: ${login_variables()} #引用debugtalk中的函数,返回一个 {'account': 'auto', 'psw': 'sdfsdfsdf', 'code': 0} # 下面可以使用 $account 和 $psw 调用 login_variables里返回的内容 保持一致 export: - cookie teststeps: - # step 1 name: 登录 request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: $account password: $psw extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx cookie: cookies.sessionid # 从cookies提取变量 validate: - equal: - $retcode - $code
7:HttpRunner 用例变量 之 参数变量 参数化时候使用(列表类型,定义在config中)
8:env variables 环境变量 --用例维护 比如url放在环境变量
项目根目录 创建维护一个 .ene文件,ene文件里写变量
.env 文件: 内容如下
base_url=http://localhost
测试用例 yaml文件引入 .env文件中定义的变量:
config:
name: login_demo
base_url: ${ENV(base_url)}
......
9:HttpRunner 参数化 独立参数
独立参数: 运行用例数 = 独立参数的笛卡尔乘积
参数化定义在 config 里面的 parameters,作用域就是整个测试用例,全局参数
用例yaml文件: config: name: login_demo base_url: http://localhost parameters: account: # 变量列表 - auto - auto2 psw: # - sdfsdfsdf - sdfsdf code: - 0 - 1 export: - cookie teststeps: - # step 1 name: 登录 request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: $account password: $psw extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx cookie: cookies.sessionid # 从cookies提取变量 validate: - equal: - $retcode - $code
当前用例使用了 parameters 参数化,hrun执行用例文件的时候会执行 8 次 2*2*2 笛卡尔乘积
account,psw,code 每个参数 2个选择,一共三组参数,笛卡尔乘积就是 2*2*2 = 8 次
10:HttpRunner 参数化 关联参数 一般使用这种比较多
# 测试用例 yaml 文件 config: name: login_demo base_url: http://localhost parameters: # 关联形式参数1-参数2-参数3: [[参数组1],[参数组2]...] 这样传了多少组就执行多少次 account-psw-code: - ['auto','sdfsdfsdf',0] - ['auto1','sdfsdf',1] export: - cookie teststeps: - # step 1 name: 登录 request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: $account password: $psw extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx cookie: cookies.sessionid # 从cookies提取变量 validate: - equal: - $retcode - $code
10:HttpRunner 初始化和清除 hook 目前只支持步骤级别的清除
在hr中实现初始化与清除机制的方式是采用hook 机制,可以在请求前和请求后调用钩子函数。
目前HR3只支持步骤层面的hook,用例层面的未实现
setup_hook 函数放置于 debugtalk.py 中,并且包含三个参数
method:请求方法
url:请求 url
kwargs:request 的参数字典
teardown_hooks:函数放置于debugtalk.py 中,必须要包含一个参数
resp_obj:request.Response实例
# debugtalk.py 定义hook_setup和hook_teardown的简单示例
# 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('执行清除步骤')
# setup_demo.yml 测试用例文件内容 config: name: caseoo1 base_url: http://localhost parameters: account-psw-code: - [ 'auto','sdfsdfsdf',0 ] export: - cookie teststeps: - # step 1 name: 登录 setup_hooks: # 初始化:支持多组参数 - ${hook_setup()} teardown_hooks: # 清除:支持多组参数 - ${hook_teardown()} request: url: /api/mgr/loginReq # 和config中的base_url进行拼接 method: POST # GET/POST/DELETE/PUT 大小写不敏感 data: username: $account password: $psw extract: # 提取响应数据--相当于导出该数据,其他步骤可以使用 retcode: body.retcode # 从响应体提取变量: body.属性.xxx #cookie: header.Set-Cookie # 从响应头提取变量: header.属性.xxx cookie: cookies.sessionid # 从cookies提取变量 validate: - equal: - $retcode - $code
hrun day2/login_case.yml -s -s:增加 print 信息的打印
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)