HttpRunner 自动化+性能测试工具

1:接口测试工具HttpRunner  httprunner中文文档:https://ontheway-cool.gitee.io/httprunner3doc_cn/user_guide/run_load_test/

通过DjiangoHttpRunner功能集成到平台里面,去做接口用例的管理
其他功能:

  用户管理
  权限管理
  登录
  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 信息的打印

 

posted @ 2023-02-01 17:20  至高无上10086  阅读(467)  评论(0编辑  收藏  举报