使用Httprunner在做接口自动化的时候,经常会遇到需要上传文件的场景,下面讲一下关于Httpruner文件上传的用例编写。

1. 建项目

首先我们使用httprunner的脚手架快速搭建一个工程

  httprunner --startproject demo

生成的工程目录结构如下图



简单介绍一下这些目录的作用,

  • apis  放接口的目录
  • testcases  放用例的目录
  • testsuites   放用例集的目录
  • reports   生成的测试报告目录
  • .env   存放系统环境变量
  • debugtalk.py   编写动态逻辑函数

2. 抓包与解析

本文使用的是Fiddler抓包工具进行抓的包,访问百度识图网站PC版 ,点击本地上传,选中本地一张图片后上传。那么在Fiddler抓包工具中,我们抓到数据大致如下图所示

选中该接口,点击File->Export Sessions->Selected Sessions, 弹出数据包类型选择,选择HTTPArchive v1.2,给文件命名,这里命名的是upload,那么将得到一个upload.har文件

3. 用例编写

打开DOS,进入到文件所在目录,执行下方命令,将har文件转成yaml文件, 得到文件upload.yml, 文件内容如下图

  har2case -2y upload.har

我们注意到,其实这个接口呢,主要就是传递了两个参数值,一个是data,就是图片数据,另一个就是params中的uptime,这是一个13位数的时间戳。其中呢,data数据是可以每次都不变的,但uptime是要随时间变化的,这其实也是一种过滤或者说校验手段,保证每次上传图片的唯一性和有效性。

3.1 处理时间戳问题

关于时间戳呢,在debugtalk.py文件中编写一个获取当前时间戳的动态函数

  import time

  def getTimeStamp():             # 获取一个13位数的时间戳
return int(time.time()*1000)

将upload.yml文件中的时间戳替换成动态函数之后,就可以无限次数上传刚才上传的那张图片了。更改如下

  uptime: ${getTimeStamp()}

3.2 处理图片上传问题

那么如果我们想要上传其他图片呢,思路也是差不多的,只需要把data中的数据换成新的图片的数据即可,也可以像获取时间戳一样写一个带参数path(图片路径)动态逻辑函数,函数读取图片并对图片进行base64编码以及设置boundary,返回编码后的数据。这样相对来说是复杂一些,对于不同的接口编码函数甚至需要更改,为什么呢?我们看到这两张图



-------------------------------------------图片分割线-----------------------------------------------------------

图一显示的就是data在webform中的样子,图二显示的就是data中的raw数据(省略了很多)。从图一和图二我们可以知道,如果要写一个关于读取图片并编码的函数的话,这个函数的返回值中,不仅被要求包含图片的base64格式数据,还要含有其余三个参数的key与其对应的value,就是 tnimage_sourcefrom这三个key,以及他们的值。

写这样的函数其实也不困难,但如果另外一个接口除了图片数据之外又有其它参数要求呢,这个时候就又需要些另外一个编码函数了, 那么有没有更方便一些的方式呢?

有,接着往下看!

前面都是铺垫,下面才是重点,重点,重点!!!


方法一   使用upload关键字

为了方便文件上传呢,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,不需要画蛇添足了,不然遇到各种奇奇怪怪的问题都无从定位。

今天写不动了,也写不完了,明天继续写....

Httprunner 文件上传场景的更多相关文章

  1. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  2. 文件上传 MIME类型检测

    简介 MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏 ...

  3. Web安全-之文件上传漏洞场景

    1   上传漏洞危害介绍 上传是Web中最常见的功能,如果上传功能存在设计.编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可 ...

  4. 【原创】JEECMS v6~v7任意文件上传漏洞(2)

    文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定 ...

  5. 【原创】JEECMS v6~v7任意文件上传漏洞(1)

    文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定 ...

  6. ASP.NET MVC之文件上传【二】(九)

    前言 上一节我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意的地方,及时进行查漏 ...

  7. 两种文件上传的实现-Ajax和form+iframe

    前言 话说现在很多很多项目需要用到文件上传,自从有了HTML5之后,上传就变的超级简单了.HTML5支持多图片上传,而且支持ajax上传,而且支持上传之前图片的预览,而且支持图片拖拽上传,而且还是纯粹 ...

  8. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  9. 聊一聊jquery文件上传(支持多文件上传)

    谈到文件上传,现在一般都用现成的组件可以使用.PC端的可以使用uploadify.针对微网站H5也有uploadifive.但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的. ...

  10. 支持断点续传的文件上传插件——Huploadify-V2.0来了

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

随机推荐

  1. 借Processing语言及IDE做DOS批处理的事务( 批量修改文件夹或文件的名字 )

    一直想用Processing语言做一些批处理的事务,因为其自带的IDE功能紧凑易用,极度轻量,又加上Java语言的生态极具友好,处理一些windows相关操作完全可行,简单快捷. 这次就是用它做[批量 ...

  2. Python基础-模块、Python操作excel

    今日概要 模块 自定义模块 内置模块 第三方模块 [!Caution] 这个地方讲的会比较多,而且有的东西网上搜不到!!! 自动化办公相关模块 -- Excel和Word 面向对象 1. 面向对象中的 ...

  3. VNCTF2025_Crypto

    VNCTF2025_Crypto Simple prediction task.py from random import shuffle from Crypto.Util.number import ...

  4. Windows编程----进程的当前目录

    进程的当前目录 Windows  Api中有大量的函数在调用的时候,需要传递路径.比如创建文件,创建目录,删除目录,删除文件等等.创建文件的APICreateFile做比喻,如果我们要创建的文件路径不 ...

  5. javascript 利用 Math.min 与 Math.max 优化逻辑判断

    文章同步发布:https://blog.jijian.link/2020-04-08/js-math-min-max/ Math.min 和 Math.max 方法常用来获取多个数值的最小值和最大值, ...

  6. 微信小程序云函数

    小程序开发云环境设置 注意事项 每一个云函数都是一个独立的 nodeJS 项目.所以每个云函数下都有 package.json 文件 错误 前端操作数据库 1 指引 2 新建集合 3 新增记录 4 查 ...

  7. 原子指令,自旋锁,CAS

    原子指令,自旋锁,CAS 问题 我们先看一下这段代码: /* * badcnt.c - An improperly synchronized counter program */ /* $begin ...

  8. 【Web】Servlet基本概念

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据, ...

  9. study Python3【2】导入模块

    import 与 from...import 在 python 用 import 或者 from...import 来导入相应的模块. 将整个模块(somemodule)导入,格式为: import ...

  10. 7. RabbitMQ 消息队列——延时队列(Spring Boot + 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解

    7. RabbitMQ 消息队列--延时队列(Spring Boot + 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解 @ 目录 7. Rabbit ...