HttpRunner HttpRunner 支持 HAR 意味着什么?

debugtalk · 2017年11月15日 · 最后由 异彩飞天 回复于 2019年08月21日 · 5738 次阅读

HttpRunner开始支持HAR啦!!!

如果你还没有体会到这三个感叹号的含义,那们你可能对HAR还不了解。

HAR 是什么?

HAR的全称为HTTP Archive,是W3C(World Wide Web Consortium)发布的一个通用标准。简单地说,HAR是一个约定的JSON文件格式,用于记录HTTP请求交互的所有内容,包括请求响应的详细记录和性能度量数据。

虽然当前HAR标准还处于Draft状态,但它已经被业界广泛地采用了,许多我们日常使用的工具都已支持HAR。在下面罗列的工具中,相信大家都已经比较熟悉了。

  • Fiddler
  • Charles Web Proxy
  • Google Chrome
  • Firebug
  • HttpWatch
  • Firefox
  • Internet Explorer 9
  • Microsoft Edge
  • Paw
  • Restlet Client

可以看出,工具覆盖了主流的抓包工具、浏览器和接口测试工具。这些工具都支持HAR标准,可以将录制得到的数据包导出为.har的文件。

假如我们可以将HAR格式转换为HttpRunner的自动化测试用例,这就相当于HttpRunner可以和非常多的工具结合使用,并获得了接口录制和用例生成功能,灵活性和易用性都将得到极大的提升。

那么,将HAR格式转换为HttpRunner的自动化测试用例是否可行呢?

我们不妨先研究下HAR的格式。

HAR 格式详解

通过如上列出的任意一款工具,都可以将录制得到的数据包导出为.har的文件。我们采用文本编辑器打开.har文件后,会发现是一个JSON的数据结构。

默认情况下,.har文件的JSON数据结构是经过压缩的,直接看可能不够直观。推荐大家可以在文本编辑器中安装Prettify JSON的插件,然后就可以将压缩后的JSON数据一键转换为美观的格式。

更好的方式是,我们可以直接查看W3C编写的HAR格式标准

通过文档可知,HAR是只有一个 key 的JSON数据结构,并且 key 值只能为log;而log的值也为一个JSON结构,里面的 key 包括:versioncreatorbrowserpagesentriescomment

{
    "log": {
        "version": "",
        "creator": {},
        "browser": {},
        "pages": [],
        "entries": [],
        "comment": ""
    }
}

其中,versioncreatorentries是必有字段,不管是哪款工具导出的.har文件,肯定都会包含这三个字段。而我们在转换生成自动化测试用例时,只需获取 HTTP 请求和响应的内容,这些全都包含在entries里面,因此我们只需要关注entries的内容即可。

entries字段对应的值为一个列表型数据结构,里面的值按照请求时间进行排序,罗列出各个 HTTP 请求的详细内容。具体地,HTTP 请求记录的信息如下所示:

"entries": [
    {
        "pageref": "page_0",
        "startedDateTime": "2009-04-16T12:07:23.596Z",
        "time": 50,
        "request": {...},
        "response": {...},
        "cache": {...},
        "timings": {},
        "serverIPAddress": "10.0.0.1",
        "connection": "52492",
        "comment": ""
    },
]

由此可见,记录的 HTTP 信息非常全面,包含了 HTTP 请求交互过程中的所有内容。

而从生成自动化测试用例的角度来看,我们并不需要那么多信息,我们只需从中提取关键信息即可。

编写自动化测试用例,最关键的信息是要知道接口的请求 URL、请求方法、请求 headers、请求数据等,这些都包含在request字段对应的字典中。

"request": {
    "method": "GET",
    "url": "http://www.example.com/path/?param=value",
    "httpVersion": "HTTP/1.1",
    "cookies": [],
    "headers": [],
    "queryString" : [],
    "postData" : {},
    "headersSize" : 150,
    "bodySize" : 0,
    "comment" : ""
}

根据这些信息,我们就可以完成 HTTP 请求的构造。

当请求发送出去后,我们要想实现自动化地判断接口响应是否正确,我们还需要设置一些断言。而与 HTTP 响应相关的所有信息全都包含在response字段对应的字典中。

"response": {
    "status": 200,
    "statusText": "OK",
    "httpVersion": "HTTP/1.1",
    "cookies": [],
    "headers": [],
    "content": {},
    "redirectURL": "",
    "headersSize" : 160,
    "bodySize" : 850,
    "comment" : ""
}

从通用性的角度考虑,我们会判断 HTTP 响应的状态码是否正确,这对应着status字段;如果我们还想在接口业务层面具有更多的判断,我们还会判断响应内容中的一些关键字段是否符合预期,这对应着content字段。

"content": {
    "size": 33,
    "compression": 0,
    "mimeType": "text/html; charset=utf-8",
    "text": "\n",
    "comment": ""
}

对于content字段,可能会稍微复杂一些,因为接口响应内容的格式可能多种多样。

例如,响应内容可能text/html页面的形式,也可能是application/json的形式,具体类型可以查看mimeType得到,而具体的内容存储在text字段中。

另外,有时候响应数据还可能是经过编码的,用的最多的编码方式为base64。我们可以根据encoding字段获取得到具体的编码形式,然后采用对应的解码方式对text进行解码,最终获得原始的响应内容。

"content": {
    "size": 63,
    "mimeType": "application/json; charset=utf-8",
    "text": "eyJJc1N1Y2Nlc3MiOnRydWUsIkNvZGUiOjIwMCwiVmFsdWUiOnsiQmxuUmVzdWx0Ijp0cnVlfX0=",
    "encoding": "base64"
},

以上面的content为例,我们通过encoding查看到编码形式为base64,并通过text字段获取到编码后的内容;那么我们就可以采用base64的解码函数,转换得到原始的内容。

>>> import base64
>>> base64.b64decode(text)
b'{"IsSuccess":true,"Code":200,"Value":{"BlnResult":true}}'

同时,我们根据mimeType可以得到响应内容application/json数据类型,那么就可以对其再进行json.loads操作,最终得到可供程序处理的JSON数据结构。

通过上述对HAR格式的详细介绍,可以看出HAR格式十分清晰,在对其充分了解的基础上,再编写测试用例转换工具就很简单了。

har2case

编码过程没有太多值得说的,直接看最终成品吧。

最终产出的工具就是har2case,是一个命令行工具,可以直接将.har文件转换为YAMLJSON格式的自动化测试用例。

当前har2case已经上传到PYPI上了,通过pipeasy_install即可安装。

$ pip install har2case
# or
$ easy_install har2case

使用方式很简单,只需在har2case命令后分别带上HAR源文件路径和目标生成的YAML/JSON路径即可。

$ har2case tests/data/demo.har demo.yml
INFO:root:Generate YAML testset successfully: demo.yml

$ har2case tests/data/demo.har demo.json
INFO:root:Generate JSON testset successfully: demo.json

可以看出,具体是生成YAML还是JSON格式的问题,取决于指定目标文件的后缀:后缀为.yml.yaml则生成YAML文件,后缀为.json则生成JSON文件。

如果不指定目标文件也行,则会默认生成JSON文件,文件名称和路径与.har源文件相同。

$ har2case tests/data/demo.har
INFO:root:Generate JSON testset successfully: tests/data/demo.json

具体的使用方式可以通过执行har2case -h查看。

在大多数情况下,生成的用例可直接在HttpRunner中使用,当然,是做接口自动化测试、接口性能测试,还是持续集成线上监控,这都取决于你。

不过,假如录制的场景中包含动态关联的情况,即后续接口请求参数依赖于前面接口的响应,并且每次调用接口时参数都会动态变化,那么就需要人工再对生成的脚本进行关联处理,甚至包括编写一些自定义函数等。

后续计划

读到这里,相信大家应该能体会到文章开头那三个感叹号的含义了,我也的确是带着难以言表的兴奋之情发布这个新功能的。

经过小范围的实际使用,效果很是不错,接口自动化测试用例的编写效率得到了极大的提升。而且,由于HAR本身的开放性,留给用户的选择非常多。

即便如此,我觉得HttpRunner的易用性还可以得到更大的提升。

当前,我规划了两项新特性将在近期完成:

  • 支持PostMan:将Postman Collection Format格式转换为HttpRunner支持的YAML/JSON测试用例;
  • 支持Swagger:将Swagger定义的 API 转换为HttpRunner支持的YAML/JSON测试用例。

等这两个新特性完成之后,相信HttpRunner会更上一个台阶。

如果你们有什么更好的想法,欢迎联系我。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
最佳回复

插入个广告:

近期大疆互联网事业部急招测试开发工程师,也就是到我所在的组。
初级、中级、高级均有指标,名额无限制。也可以近期面试,拿到 offer 后年后入职。
本次招聘到年底前均有效。

有意向的同学可将简历发送至我的邮箱: mail@debugtalk.com

共收到 32 条回复 时间 点赞

HttpRunner 开始支持 HAR ,意味着同时支持了一大堆主流工具,包括 Fiddler/Charles/Chrome/Firefox/HttpWatch 等等,以此实现脚本录制和生成功能。

https://github.com/HttpRunner/har2case

很赞的功能!

赞!受益匪浅,我的框架也有很多思想受益于您的启发

Robert.Jiang 回复

好的框架要分享出来哦。只有相互多交流,才能更好的提升

nicolas 回复

惭愧啊,一直觉得自己的框架不够完善,没好意思开源出来😅

Robert.Jiang 回复

要走出去。
晒晒更健康 :-)

插入个广告:

近期大疆互联网事业部急招测试开发工程师,也就是到我所在的组。
初级、中级、高级均有指标,名额无限制。也可以近期面试,拿到 offer 后年后入职。
本次招聘到年底前均有效。

有意向的同学可将简历发送至我的邮箱: mail@debugtalk.com

招人啦招人啦,年前面试年后入职

踩过一些坑。
可以将 pcap 转 har。
har 的 bodysize 不 work,当然 sometimes,需取 transferSize。
chrome devtools wizard window 不能 cross site call,我给官方提交过 bug。
官方文档落后。
webview 的加载时间机制计算需要结合插件的编写。
解析我封装的对象。
有些 har 不能 escape to json。

卡农Lucas 回复

哦对,支持工具的列表里面没有 wireshark

赞!这样转化可以节省很多时间,但是有的接口有执行顺序问题,比如某个接口,需要用到登录之后返回的 authtoken。 这种还需要手动的进行调整下。

另外还有个问题需要解决,登录之后的 AuthToken,在其他接口中是写死的。下次再运行,这个 AuthToken 可能已经失效了。因此这个得搞成可变的变量。

脚本录制都会存在这样的问题,除非再实现一些自动关联机制,这个后续再看情况是否添加上

你说的是参数关联的情况,这个 AuthToken 就不能写死,应该是每次生成传递给后续接口

debugtalk 回复

自动生成的是写死的,我试试能不能转成 extract_binds: 这种变量形式的。

@debugtalk http-archive-viewer
https://chrome.google.com/webstore/detail/http-archive-viewer/ebbdbdmhegaoooipfnjikefdpeoaidml?hl=en

This utility allows you to inspect HAR log files generated by browser's. HAR (HTTP Archive) files can be generated by most browsers and contain a log of HTTP requests and responses, they can also contain body content. Excellent for debugging HTTP sessions.

老马 回复

HAR 是通用的标准,支持的工具挺多的,这也是一个很大的优势

陈恒捷 回复

能不能帮忙把论坛的雪花去掉,或者提供一个开关,可以关掉的,不知道是不是一个页面打开的久了,好多小点闪,看的眼花

bauul 回复

不在电脑旁,今晚回去改

基本上看了一遍,感觉这就是我接口自动化测试框架的 心念之选了。 谢谢大佬,造福我们这些技术不是特别好的初级测试,即可使用,又可从中学习,感谢!!!

柳锐神 回复

多谢支持

仅楼主可见
梦梦GO 回复

多谢建议。实际操作起来可能会比较难,我尽量。

支持 Swagger:将 Swagger 定义的 API 转换为 HttpRunner 支持的 YAML/JSON 测试用例。

后面没有看到关于 Swagger Api 转换的,这个还在排期之中吗
最近使用这个 各种受益 感谢楼主~

梦梦GO 回复

swagger 的还没做,会优先做 PostMan 生成的功能

今天初次录制了一条用例,通过 hrun aaa.json 运行时会提示 “ ImportError: No module named 'requests_toolbelt' ”,通过 pip install requests-toolbelt 后解决,我用的 deepin,不知是不是和系统有关

Jacc 回复

这是一个 bug,在安装依赖包里面遗漏了 requests-toolbelt。

这个我还是想问一下,对于这种 fromdata 格式的数据怎么处理

fl = open('1.png','rb')
files = {'attachment_file': ('1.png', fl, 'image/png', {})}
r1 = requests.post('http://www.xxxx.com/upload', files=files, data=values)
fl.close()

我是在用例中直接添加了 files,但是很是失败的
request:
files:
# 传递文件内容
!! python/unicode 'avatar': !! python/unicode ${getFromData()}

你好!能问一下如何离线安装 httprunner 呀?😀 😀 😀 😀

我 想请问哪款工具可以支持把多个请求导出多个 har 文件?然后 har2case 支持处理多个 har 文件吗?

异彩飞天 回复

将多个请求导出为多个 har 文件,意义在哪里呢?

debugtalk 回复


类似这样,虽然 Charles 支持多个请求合并导出一个 har,但是通过 har2case 转成 case 只有一个。如果逐个请求转换成 har,再将 har 转成 testcase 的话,接口多了也费时,主要还是重复工作。

自己写了个小脚本把 har 目录下的文件批量转 testcase,然后剪切到 testcases/目录下

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册