HttpRunner V3.x 从入门到精通

HttpRunner 是一个基于 Python 的通用 HTTP 自动化测试框架,适用于自动化测试、性能测试、线上监控等场景。本文介绍了HttpRunner的框架设计理念、核心特点、环境说明、安装方法、快速生成项目、项目结构、测试用例结构解析、录制生成测试用例的步骤以及运行测试用例的不同方式。重点讲解了如何使用har2case将HTTP请求转换为测试用例,并探讨了HttpRunner与pytest的集成和用例结构。
摘要由CSDN通过智能技术生成

一、介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
官方文档:https://docs.httprunner.org/

二、框架设计理念

  • 充分复用优秀的开源项目,不追求重复造轮子,而是将强大的轮子组装成战车
  • 遵循 约定大于配置 的准则,在框架功能中融入自动化测试最佳工程实践
  • 追求投入产出比,一份投入即可实现多种测试需求

三、核心特点

  • 继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求
  • 以YAML或JSON格式定义testcase,使用pytest运行,更加简洁优雅
  • 有了pytest,成百上千的插件随时可用
  • 支持variables/extract/validate/hooks机制来创建极其复杂的测试场景
  • 借助辅助函数(debugtalk.py),任何函数都可以在测试用例的任何部分中使用
  • 支持完善的测试用例分层机制,充分实现测试用例的复用
  • 使用python的第三方库jmespath,让提取和验证json响应更简单
  • 基于 HAR 实现接口录制和用例生成功能(har2case)
  • 结合 Locust 框架,无需额外的工作即可实现分布式性能测试
  • 执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完美结合
  • 集成了Allure,让测试报告更加漂亮,内容更丰富。
  • 极强的可扩展性,轻松实现二次开发和 Web 平台化

四、环境说明

HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS、Linux、Windows 系统平台上。笔者使用的是macOS系统,所以后续都是基于macOS系统的学习。

另外,HttpRunner 支持 Python 3.5 及以上的所有版本,虽然 HttpRunner 暂时保留了对 Python 2.7 的兼容支持,但强烈建议使用 Python 3.6 及以上版本。

电脑上还没安装Python的童鞋还请自行查询安装,非常的简单,这里附上python的官方地址:https://www.python.org/

五、安装HttpRunner

HttpRunner 的稳定版本托管在 PyPI 上,可以使用pip进行安装,非常的便捷。
打开命令行,输入安装命令即可:
二、安装HttpRunner
HttpRunner 的稳定版本托管在 PyPI 上,可以使用pip进行安装,非常的便捷。
打开CMD,输入安装命令即可:

pip install httprunner

如果已经安装过的,也可以进行更新升级一下。

pip install -U HttpRunner

检验是否安装成功
输入命令:

$ hrun -V
3.1.4

显示出版本号,说明安装成功。
你也可以通过输入:hrun -h,查看命令帮助说明。
在 HttpRunner 安装成功后,系统中会新增 4 个命令:

  • httprunner: 核心命令
  • hrun:httprunner 的缩写,功能与 httprunner 完全相同
  • hmakehttprunner make的别名,用于将YAML/JSON测试用例转换为pytest文件
  • har2case:辅助工具,可将标准通用的 HAR 格式(HTTP Archive)转换为YAML/JSON格式的测试用例

六、快速生成项目

环境装好了,相信很多童鞋已经迫不及待的想run起来了,但是面对一个陌生的框架又无从下手。没关系,我们可以用脚手架来快速生成一个httprunner项目。
我们不妨先输入httprunner startproject -h,来看一下命令说明。

chenshiengdeMBP:PythonCode chenshifeng$ httprunner startproject -h

usage: httprunner startproject [-h] [project_name]

positional arguments:
  project_name  Specify new project name.

optional arguments:
  -h, --help    show this help message and exit

可以看出,只需要在命令后面带上项目名称这个参数就好了,那就先来创建一个项目,名称叫httprunner_demo。

chenshiengdeMBP:PythonCode chenshifeng$ httprunner startproject httprunner_demo
2021-05-04 17:27:16.152 | INFO     | httprunner.scaffold:create_scaffold:43 - Create new project: httprunner_demo
Project Root Dir: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo

created folder: httprunner_demo
created folder: httprunner_demo/har
created folder: httprunner_demo/testcases
created folder: httprunner_demo/reports
created file: httprunner_demo/testcases/demo_testcase_request.yml
created file: httprunner_demo/testcases/demo_testcase_ref.yml
created file: httprunner_demo/debugtalk.py
created file: httprunner_demo/.env
created file: httprunner_demo/.gitignore

$ tree httprunner_demo -a
2021-05-04 17:27:16.161 | WARNING  | httprunner.scaffold:show_tree:29 - tree command not exists, ignore.
Sentry is attempting to send 0 pending error messages
Waiting up to 2 seconds
Press Ctrl-C to quit
chenshiengdeMBP:PythonCode chenshifeng$

项目生成完毕,也是非常的简单。
如果你输入的项目名称已经存在,httprunner会给出warning提示。

chenshiengdeMBP:PythonCode chenshifeng$ httprunner startproject httprunner_demo
2021-05-04 17:29:00.631 | WARNING  | httprunner.scaffold:create_scaffold:32 - Project folder httprunner_demo exists, please specify a new project name.

$ tree httprunner_demo -a
2021-05-04 17:29:00.636 | WARNING  | httprunner.scaffold:show_tree:29 - tree command not exists, ignore.
Sentry is attempting to send 0 pending error messages
Waiting up to 2 seconds
Press Ctrl-C to quit

相信了解过django的童鞋能感觉到,httprunner startproject这个命令跟django里的django-admin.py startproject project_name 很像,没错,其实httprunner的想法正式来源于django,这就是httprunner作为一个优秀开源技术资源整合和复用的体现之一,后续还有很多,届时提点出来。

七、项目结构梳理

我把生成出的项目用pycharm打开,可以看的生成的目录结构如下图,那么这些都是什么意思呢?

image
  • debugtalk.py 放置在项目根目录下(借鉴了pytest的conftest.py文件的设计)
  • .env 放置在项目根目录下,可以用于存放一些环境变量
  • reports 文件夹:存储 HTML 测试报告
  • testcases 用于存放测试用例
  • har 可以存放录制导出的.har文件
    具体用法会在后续中细讲,我们可以点开生成的testcases文件夹下的测试用例,里面是提供了一个可运行的demo内容的,那先来运行一下看看。
    image

运行用例:hrun httprunner_demo

chenshiengdeMBP:PythonCode chenshifeng$ hrun httprunner_demo
2021-05-04 17:38:15.284 | INFO     | httprunner.make:__make:512 - make path: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo
2021-05-04 17:38:15.290 | INFO     | httprunner.compat:ensure_testcase_v3:219 - ensure compatibility with testcase format v2
2021-05-04 17:38:15.293 | INFO     | httprunner.loader:load_dot_env_file:127 - Loading environment variables from /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/.env
2021-05-04 17:38:15.294 | DEBUG    | httprunner.utils:set_os_environ:33 - Set OS environment variable: USERNAME
2021-05-04 17:38:15.294 | DEBUG    | httprunner.utils:set_os_environ:33 - Set OS environment variable: PASSWORD
2021-05-04 17:38:15.296 | INFO     | httprunner.make:make_testcase:349 - start to make testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_ref.yml
2021-05-04 17:38:15.306 | INFO     | httprunner.compat:ensure_testcase_v3:219 - ensure compatibility with testcase format v2
2021-05-04 17:38:15.306 | INFO     | httprunner.make:make_testcase:349 - start to make testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_request.yml
2021-05-04 17:38:15.307 | INFO     | httprunner.make:make_testcase:442 - generated testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_request_test.py
2021-05-04 17:38:15.308 | INFO     | httprunner.make:make_testcase:442 - generated testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_ref_test.py
2021-05-04 17:38:15.317 | INFO     | httprunner.compat:ensure_testcase_v3:219 - ensure compatibility with testcase format v2
2021-05-04 17:38:15.317 | INFO     | httprunner.make:make_testcase:349 - start to make testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_request.yml
2021-05-04 17:38:15.317 | INFO     | httprunner.make:format_pytest_with_black:170 - format pytest cases with black ...
reformatted /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_ref_test.py
reformatted /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/testcases/demo_testcase_request_test.py
All done! ✨ 🍰 ✨
2 files reformatted.
2021-05-04 17:38:16.063 | INFO     | httprunner.cli:main_run:56 - start to run tests with pytest. HttpRunner version: 3.1.4
============================================= test session starts ==============================================
platform darwin -- Python 3.9.2, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: /Users/chenshifeng/MyCode/PythonCode
plugins: metadata-1.11.0, html-2.1.1, allure-pytest-2.8.40
collected 2 items                                                                                              

httprunner_demo/testcases/demo_testcase_ref_test.py .                                                    [ 50%]
httprunner_demo/testcases/demo_testcase_request_test.py .                                                [100%]

============================================== 2 passed in 6.21s ===============================================

可以看的httprunner输出了运行过程中的调试信息。最后,运行结束,2个用例运行pass。

八、录制生成测试用例

在正式手动编写case之前,我们可以先来熟悉下httprunner的录制生成用例功能。
用postman的童鞋都知道,里面有个功能可以将接口转换成代码,可以直接copy过来使用,提升case编写效率。
那httprunner的录制生成用例功能又是怎么回事呢?

8.1、har2case

其实,这都要依托于另一个独立的项目-har2case。
原理就是当前主流的抓包工具和浏览器都支持将抓取得到的数据包导出为标准通用的 HAR 格式(HTTP Archive),然后 HttpRunner 将 HAR 格式的数据包转换为YAML/JSON格式的测试用例文件。
比如,我现在用macOS系统上的Charles去抓取一个百度首页搜索httprunner的请求。

image

选中这个请求,点击左上角的File——Export Sessions——(可以选择导出选中的也可以导出所有),这里我们选择导出选中的,导出HTTPArchive,文件名baidu_home.har,保存到了项目的har目录下。
image
image

8.2、转换为pytest文件

运行命令将har文件转换成测试用例:

har2case baidu_home.har
chenshifengdeMacBook-Pro:har chenshifeng$ har2case baidu_home.har
2021-05-04 17:52:23.608 | INFO     | httprunner.ext.har2case.core:gen_testcase:356 - Start to generate testcase from /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/har/baidu_home.har
2021-05-04 17:52:23.608 | INFO     | httprunner.ext.har2case.core:_make_testcase:347 - Extract info from HAR file and prepare for testcase.
2021-05-04 17:52:23.611 | INFO     | httprunner.compat:ensure_testcase_v3:219 - ensure compatibility with testcase format v2
2021-05-04 17:52:23.611 | INFO     | httprunner.loader:load_dot_env_file:127 - Loading environment variables from /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/.env
2021-05-04 17:52:23.612 | DEBUG    | httprunner.utils:set_os_environ:33 - Set OS environment variable: USERNAME
2021-05-04 17:52:23.612 | DEBUG    | httprunner.utils:set_os_environ:33 - Set OS environment variable: PASSWORD
2021-05-04 17:52:23.612 | INFO     | httprunner.make:make_testcase:349 - start to make testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/har/baidu_home.har
2021-05-04 17:52:23.613 | INFO     | httprunner.make:make_testcase:442 - generated testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/har/baidu_home_test.py
2021-05-04 17:52:23.613 | INFO     | httprunner.make:format_pytest_with_black:170 - format pytest cases with black ...
reformatted /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/har/baidu_home_test.py
All done! ✨ 🍰 ✨
1 file reformatted.
2021-05-04 17:52:23.914 | INFO     | httprunner.ext.har2case.core:gen_testcase:377 - generated testcase: /Users/chenshifeng/MyCode/PythonCode/httprunner_demo/har/baidu_home_test.py
Sentry is attempting to send 0 pending error messages
Waiting up to 2 seconds
Press Ctrl-C to quit

生成完毕,在har目录下可以看到生成出的python文件:

# NOTE: Generated By HttpRunner v3.1.4
# FROM: har/baidu_home.har


from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase


class TestCaseBaiduHome(HttpRunner):

    config = Config("testcase description").verify(False)

    teststeps = [
        Step(
            RunRequest("/s")
            .get("https://www.baidu.com/s")
            .with_params(
                **{
                    "ie": "utf-8",
                    "mod": "1",
                    "isbd": "1",
                    "isid": "C9FF25725AB54698",
                    "f": "8",
                    "rsv_bp": 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值