欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

httprunner使用(一)

程序员文章站 2022-03-12 16:56:39
...

最近闲来无事翻开论坛闲逛看到了一款基于python语言的开源接口测试工具httprunner,这款工具初始体验就是它的测试用例是维护在一个yml格式或者json格式的数据文件中。只要维护好了这个文件,然后一键命令执行就可以得到想要的结果,而且这种文件生成也非常的方便,使用fiddler可以导出har格式文件然后命令转换为yml或者json格式。这个工具看起来简直就是为我等测试懒人量身打造的,不用更待何时!!

关于安装httprunner
一行命令即可搞定 pip install httprunner
升级httprunner版本: pip install -U httprunner
查看httprunner版本:hrun -V
查看har插件版本:har2case -V

:httprunner最好是在python3环境当中安装,以免出现兼容性问题。

fiddler导出har文件
(一)学会用fiddler导出har文件
fiddler抓包相信大多数有经验的测试都会,不再赘述。这里抓取的是我司的系统登录,系统登录后要获取使用权限,其中登录接口后会调用另一个接口,传动态ticket给权限接口拉取用户权限。

系统打开到登录页面,打开fiddler并使其处于监测状态,登录系统,可以看到fiddler已经抓取到了这两个接口。我们先停止fiddler监控以免页面有过多数据干扰操作。

fiddler选中登录接口,File->Export Sessions->Selected Sessions->HTTPArchive v1.2导出har文件。
httprunner使用(一)
httprunner使用(一)
har文件转换为yml文件或者json文件
windows端打开命令终端窗口输入命令:
har2case E:\httpTest\55.har -2y 加了-2y的表示转换成yml文件,否则是默认转换为json文件,转换后的yml文件内容:

config:
    name: testcase description
    variables: {}
teststeps:
-   name: /urc/motan/service/api/IUrcService/login
    request:
        data:
            deviceName: Chrome浏览器
            pwd: 密码隐藏**
            userName: 用户名隐藏**
        headers:
            Content-Type: application/x-www-form-urlencoded
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
            group: rpc-service-group-test
            paramType: '2'
            prefix: com.yks
            version: '1.0'
        method: POST
        url: https://h2-test.youkeshu.com/urc/motan/service/api/IUrcService/login
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - application/json
    -   eq:
        - content.msg
        - 登陆成功
    -   eq:
        - content.state
        - '000001'

上面文件可以在终端输入命令执行:hrun E:\httpTest\test1.yml,执行成功后生成测试报告:httprunner使用(一)
提取响应数据
上面的登录接口要拿取到响应数据的data中的三个字段:ticket,userName,personName传给权限获取接口。提取接口响应数据是用extract提取器,对应响应数据是json格式的我们可以用conteng.**的格式来提取,对于ticket字段,使用content.data.ticket提取。在上面的代码中加入如下代码段:

extract: 
 - ticket: content.data.ticket
 - operator: content.data.userName
 - personName: content.data.personName

变量在接口间传递
前面在登录接口响应数据中提取的参数要创给权限获取接口的request中,我们用$ticket,即前面多了一个美元符号

在这里插入代码片

url优化
在config语句块中添加,一个接口url通常由域名+资源路径组成,前面的登录接口是:https://h2-test.youkeshu.com + /urc/motan/service/api/IUrcService/login 组成。
修改成这样简化接口参数:

config:
    name: testcase description
    baseurl: https://h2-test.youkeshu.com
    variables: {}
teststeps:
-   name: 登录系统
    request:
        data:
            deviceName: Chrome浏览器
            pwd: 密码隐藏**
            userName: 用户名隐藏**
        headers:
            Content-Type: application/x-www-form-urlencoded
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
            group: rpc-service-group-test
            paramType: '2'
            prefix: com.yks
            version: '1.0'
        method: POST
        url: /urc/motan/service/api/IUrcService/login
    extract: 
      - ticket: content.data.ticket
      - operator: content.data.userName
      - personName: content.data.personName
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - application/json
    -   eq:
        - content.msg
        - 登陆成功
    -   eq:
        - content.state
        - '000001'

多个接口串联组成测试场景–查询数据
前面说了用$+字符串的形式作为变量传递,所以组合在一起的代码就是这样的:

- config:
    name: testcase description
    base_url: https://h2-test.youkeshu.com
- test:
    name: 登录系统
    request:
        data:
            pwd: 密码隐藏**
            userName: 用户名隐藏**
        headers:
            Content-Type: application/x-www-form-urlencoded
            group: rpc-service-group-test
            paramType: '2'
            prefix: com.yks
            version: '1.0'
        method: POST
        url: /urc/motan/service/api/IUrcService/login
    extract:
        - ticket: content.data.ticket
        - userName: content.data.userName
        - personName: content.data.personName
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - content.msg
        - 登陆成功
    -   eq:
        - content.state
        - '000001'
    -   eq: 
        - content.data.ticket
        - $ticket
- test: 
    name: 获取权限
    request:
        headers:
            Content-Type: application/json
            group: rpc-service-group-test
            paramType: '1'
            prefix: com.yks
            version: '1.0'
        json:
            funcVersion: b66ebf758783d1aced4d2c378154836b
            moduleUrl: /pms/prmanage/prquery/
            operator: $userName
            personName: $personName
            requestId: 03251416520959c722b99df50d8b1f68
            ticket: $ticket
        method: POST
        url: /urc/motan/service/api/IUrcService/getAllFuncPermit
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - content.msg
        - 成功
    -   eq:
        - content.state
        - '000001'

- test:
    name: 查询PR单
    request:
        headers:
            Content-Type: application/json
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
            group: rpc-service-group-test
            paramType: '1'
            prefix: com.yks
            version: '1.0'
        json:
            data:
                merchandiser: yanfukun
                opEmployee: yanfukun
                pageData: 20
                pageNumber: 1
                prState: 0
                searchContents: []
                searchType: 1
                warehouse: 0
            deviceName: Chrome浏览器
            funcVersion: b66ebf758783d1aced4d2c378154836b
            moduleUrl: /pms/prmanage/prquery/
            operator: $userName
            personName: $personName
            requestId: 03251416524407009e3b27d1e39147f2
            ticket: $ticket
        method: POST
        url: /pmsservice/api/PrSearch/prSearch
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - application/json
    -   eq:
        - content.state
        - '000001'
    -   eq:
        - content.msg
        - 操作成功

**注:**主要yml数据格式,特别是单个接口用例和多个接口串联时的格式不同,小心调入坑中。我第一次也是在这个格式中徘徊了 一天,所以要熟悉yml的数据格式是很重要的。不熟悉的可以使用json格式来编写用例。

串联接口执行结果:
httprunner使用(一)