使用Httprunner在作接口自动化的时候,常常会遇到须要上传文件的场景,下面讲一下关于Httpruner文件上传的用例编写。
web
首先咱们使用httprunner的脚手架快速搭建一个工程json
httprunner --startproject demo
生成的工程目录结构以下图api
简单介绍一下这些目录的做用,app
本文使用的是Fiddler抓包工具进行抓的包,访问百度识图网站PC版 ,点击本地上传,选中本地一张图片后上传。那么在Fiddler抓包工具中,咱们抓到数据大体以下图所示cors
选中该接口,点击File->Export Sessions->Selected Sessions, 弹出数据包类型选择,选择HTTPArchive v1.2,给文件命名,这里命名的是upload,那么将获得一个upload.har文件函数
打开DOS,进入到文件所在目录,执行下方命令,将har文件转成yaml文件, 获得文件upload.yml, 文件内容以下图工具
har2case -2y upload.har
咱们注意到,其实这个接口呢,主要就是传递了两个参数值,一个是data,就是图片数据,另外一个就是params中的uptime,这是一个13位数的时间戳。其中呢,data数据是能够每次都不变的,但uptime是要随时间变化的,这其实也是一种过滤或者说校验手段,保证每次上传图片的惟一性和有效性。
测试
关于时间戳呢,在debugtalk.py文件中编写一个获取当前时间戳的动态函数网站
import time def getTimeStamp(): # 获取一个13位数的时间戳 return int(time.time()*1000)
将upload.yml文件中的时间戳替换成动态函数以后,就能够无限次数上传刚才上传的那张图片了。更改以下ui
uptime: ${getTimeStamp()}
那么若是咱们想要上传其余图片呢,思路也是差很少的,只须要把data中的数据换成新的图片的数据便可,也能够像获取时间戳同样写一个带参数path(图片路径)动态逻辑函数,函数读取图片并对图片进行base64编码以及设置boundary,返回编码后的数据。这样相对来讲是复杂一些,对于不一样的接口编码函数甚至须要更改,为何呢?咱们看到这两张图
-------------------------------------------图片分割线-----------------------------------------------------------
图一显示的就是data在webform中的样子,图二显示的就是data中的raw数据(省略了不少)。从图一和图二咱们能够知道,若是要写一个关于读取图片并编码的函数的话,这个函数的返回值中,不只被要求包含图片的base64格式数据,还要含有其他三个参数的key与其对应的value,就是 tn,image_source, from这三个key,以及他们的值。
写这样的函数其实也不困难,但若是另一个接口除了图片数据以外又有其它参数要求呢,这个时候就又须要些另一个编码函数了, 那么有没有更方便一些的方式呢?
有,接着往下看!
前面都是铺垫,下面才是重点,重点,重点!!!
为了方便文件上传呢,Httprunner 2.4.1以上版本支持upload关键字,能够在请求中添加相应参数便可完成图片上传。以刚才的百度图片上传为例,使用关键字upload后的代码是
config: name: testcase description variables: {} teststeps: - name: /upload request: verify: False upload: image: logo.jpg image_source: PC_UPLOAD_FILE tn: pc from: pc headers: Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 X-Requested-With: XMLHttpRequest method: POST params: uptime: ${getTimeStamp()} url: https://graph.baidu.com/upload validate: - eq: - status_code - 200 - eq: - headers.Content-Type - application/json - eq: - content.is_intervene - false - eq: - content.status - 0 - eq: - content.msg - Success
是否是很是很是简单呢,直接使用upload字段就能够完成编码并上传的功能了。在upload字段下面,咱们有四个参数:image, image_source, tn, from。
很眼熟吧,这四个参数就只以前咱们提到的那些参数了,其中咱们只须要重点关注image, 由于这个key的值是一个file,也就是咱们须要上传的文件,因此这里填写的就是咱们须要上传的图片的路径。而这个图片路径须要很是注意,它必定是相对于运行路径。以个人项目文件结构为例
如图所示,Logo.jpg文件与api,reports,testcases,testsuites等是处于同一层级的,Logo.jpg和它们都是在根目录demo下的子层级,不要当作属于testsuites了。若是在demo中执行脚本,即命令
hrun api/upload.yml
那么image的值就Logo.jpg。 若是进入到api中执行,即命令
hrun upload.yml
那么image的值就是 ../Logo.jpg, 由于图片在api里的上一层级。这一点须要重点注意!!!
此外呢,可能你们也注意到使用upload字段的脚本下Headers选项中Content-type被删除了,这是由于upload会自动生成对应的Content-type,不须要多此一举了,否则遇到各类奇奇怪怪的问题都无从定位。
今天写不动了,也写不完了,明天继续写....