HttpRunner学习

最近了解到大疆有一款开源的测试工具HttpRunner,可以用于自动化测试和性能测试。先下载了源码,结合HttpRunner文档,实战了下自动化测试部分功能。工具编码风格及自动化测试思路都值得借鉴。提供简洁编写自动化用例的方式,用例编写技术要求低、而且简洁易写。

安装

有网络安装:pip install httprunner (pip install -U httprunner,-U表示升级,第一次装不需要-U),会自动安装需要的相应包,比如har2case等。

无网络安装:需要复制requests/PyYAML/Jinja2/har2case/cocorama/colorlog/requests_toolbelt等包(具体见源码setup.py中install_requires项)到python27对应site-packages目录,如果只是拷贝包,无法使用hrun命令,需要下载源码切换到setup.py目录,python setup.py install,安装,即可使用hrun、har2case命令。

使用命令 har2case -V,hrun -V ,或者--version可查看对应版本。

Httprunner 不仅支持Python3 .4+,2.7也可以,可见setup.py中python_requires。

har文件准备

Charles抓包testerhome,右键export请求,存为har格式。

或者Fiddler抓包,导出session,存为HTTPArchive(har)格式文件。

常用命令

hrun --startproject demo 脚手架功能快速创建项目目录结构,具有测试用例分层机制。

har2case testdemo.har 默认在当前目录生成json文件

har2case testdemo.hartestdemo.yml 生成yaml文件

hrun testdemo.yml 运行yml用例

hrun demo.yml —failfast  失败后不再执行后面步骤。

hrun testcases/testdemo.yml --failfast --log-level debug 运行testcases目录里的testdemo.yml用例,遇到失败用例停止执行,debug模式会在命令框输出更详细信息。

注意:必须在项目目录中debugtalk.py同层目录执行hrun,har2case等命令。

上述命令可以和jenkins结合起来。持续部署。

初始项目结构

HttpRunner学习_第1张图片

  • debugtalk.py

1、封装底层函数。

2、引入全局变量,import os,os.environ("xxx"),可以引入存在.env文件中的变量。

.env文件:

HttpRunner学习_第2张图片

debugtalk.py:

HttpRunner学习_第3张图片

后面可以使用$Env变量,值为st1。

  • reports目录

保存生成的测试报告html文件。

  • .env文件

保存全局数据,比如环境、密码等。

  • testcases

保存用例,yaml或者json格式文件。

  • api

用例分层机制,保存具体接口调用、传参、校验等方法,供testcases中testcase使用。

  • testsuites

测试套件,包含多个测试用例。

  • 一个最基本的用例
- config:
    name: testset description
    parameters:
        - custName: [张一]
        - var1-var2-var3: ${P(data/t0.csv)}
        - var4-var5: ${func1()}
    variables: 
        - {mobile: "${autoGenMobile()}"}
        - {idno: "${autoGenIdNo()}"}
        - {db: dbname}
    requests: 
        base_url: http://httpbin-$url_env.api.xxx.cn
        headers:
            Content-Type: application/x-www-form-urlencoded
            EnvParams: $EnvParams
            User-Agent: Mozilla/5.0 ……
    setup_hooks: ['${hook_print(setup)}']
    teardown_hooks: ['${hook_print(teardown)}']
    output: [mobile]
- test:
    name: 加密手机号
    api: encrypt($mobile,MOBI_NO)
    extract:
        -{encrypt_mobile: content}
- test:
    name: /register/xxxx.json
    api: xxxx($mobile,$S)
    variables:
        - {mobile: $mobile}
        - {S: '${get_s()}'}
    extract:
        - {cookies: headers.Set-Cookie}
    validate: 
        - eq: [content.ret,'0']

 

 

config是当前用例的全局数据,test是每一个测试步骤,

可以通过$变量名的方式使用任何全局变量,可以通过格式${funcname($xx,$xx)}使用定义在debugtalk.py 的函数。

extract:提取当前测试步骤返回值内容作为全局变量,比如headers.content-type,content.ret等。

validate:校验,eq. 多种形式,见httprunner源码例子。

validate:
        - eq: ["status_code",200]
        - assert_status_code_is_200: ["status_code"]
        - {"check": "content.success","comparator": "eq","expect": false}
        - startswith: [content.User-Agent,"python-requests"]

HttpRunner学习_第4张图片

 

api:用例分层,对单个接口进行封装,减少改动,

- api:
    def : xxxx($mobile,$S)
    request:
        url: http://xx-$url_env.xx.cn/xxx/xxx.json
        method: POST
        headers:
            Cookies: ""
        params:
            _s: $S
        data: 
            mobile: $mobile
    validate:
        - eq: ["status_code",200]

 

api作为第一层,多个api组成的testcase作为第二层,可以作为一个suite,第三层调用suite。

在调用api的testcase config中加一行 def suitename($xx,$xx),此testcace 可以作为testsuite调用。

HttpRunner学习_第5张图片

另一文件中:

setup_hooks:[],teardown_hooks:[],config中:用例执行前后执行的方法;test中 每个测试步骤前后执行的方法。

 

使用注意事项

httprunner不支持函数里嵌函数(函数参数为函数的形式)---可用api实现,api参数为变量,参数可以为函数执行后的值;

函数参数可以是$方式执行或者需要替换的变量;

teststep中局部变量会替换全局config变量;

用例步骤中 times 表示执行次数;

httprunner buit_in.py里有很多自定义函数,相当于debugtalk.py中自定义方法,可以直接使用。

url中可以用变量$变量名:

requests:

        base_url:http://httpbin-$url_env.api.xxx.cn

 

yml文件编写注意事项:字典的冒号要空格,变蓝色才行;列表的-也要空格,见下图:

HttpRunner学习_第6张图片

env中定义的变量,在debugtalk中import os os.environ的方式设为全局变量才能使用。

http_client_session 问题:调用其他url,会保存session,会带入到同一个用例的下一个http请求中;

如果需要新建session,可以在封装的api中,指定headers Cookie:“”为空。

 

config headers中信息是全局的,测试步骤中如果不指定对应headers项,会使用config中默认值。

 

参数化三种方式

parameters中变量的值,多个变量间会用笛卡尔积(两两组合)的方式传参作为一个用例。

csv文件第一行是变量名,第二行开始是数据,${P(xx.csv)}中第一行变量名必须包括要赋值给的变量名。

变量名间用短横线分隔,用函数生成数据时,可对应赋值。但是函数只会执行一次,生成数据,然后用于笛卡尔积组合参数。

- config:

name:"demo"

parameters:

- user_agent: ["iOS/10.1","iOS/10.2","iOS/10.3"]

- user_id: ${P(user_id.csv)}

- username-password: ${get_account(10)}#注意函数返回值格式必须为 - a-b时[{'a':1,'b':1},{'a':2,'b':2}],为了与csv数据格式兼容

测试报告与用例suite执行采用unittest模式。

 

参考文档:httprunner中文使用手册:https://cn.httprunner.org

你可能感兴趣的:(httprunner)