🎉 🎂 🍰 TesterHome 创立 6 周年纪念日 🍰 🎂 🎉

HttpRunner HttpRunner 支持 HAR 意味着什么?

debugtalk · 2017年11月15日 · 最后由 wqsong 回复于 2018年07月26日 · 1893 次阅读

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

共收到 29 条回复 时间 点赞

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

https://github.com/HttpRunner/har2case

很赞的功能!

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

Robert.jiang 回复

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

Jackychen 回复

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

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。

lucasluo 回复

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

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

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

liwei_721 回复

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

liwei_721 回复

你说的是参数关联的情况,这个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.

harsayer 回复

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

chenhengjie123 回复

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

carl 回复

不在电脑旁,今晚回去改

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

wch352136 回复

多谢支持

仅楼主可见
dreamer.li 回复

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

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

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

dreamer.li 回复

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呀?😀 😀 😀 😀

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