测试平台系列(92) 让http请求支持文件上传
大家好~我是
米洛!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记,获取最新文章教程!
回顾
上一节呢,我们编写了oss的客户端这块内容。但其实我们是有目的的,我们知道,我们有时候测试一些接口,比方说: 批量导入商品,这种情况下,我们是要给接口发送一个文件(excel或者csv)。
那怎么保管我们的测试数据呢,那就该oss发挥它的作用了。以往我们做测试,都会放一个目录保存测试数据,现在只不过是把数据放到了oss之中,其实道理都一样。
今天我们就来实现http请求支持oss文件上传。在此之前我们先得修复几个bug(还挺多的,但只列一个典型)
bug警示
- 没有断言数据的时候报错

需要2个返回值,但是咱在没有断言的时候只给了一个,属实马虎。
效果图


思路
我们之前为了图方便,在有body的http请求里面,强行让http请求二选一:
要么json
要么form表单
针对这样文件的形式,就没法二选一了,所以我们必须要存储一个字段:
body_type,这个字段用来告诉我们body是什么类型的,也就对应这里的数据:

0代表none, 2代表form-data 1代表raw(json) 3代表x-www-form-urlencoded, 后续的依次排列。
所以我们要去用例加个body_type,并且默认为1(因为目前我们的接口类型大部分json的).
接着我们在http请求的时候,根据不同的数据类型返回不同的body即可。
新增字段body_type

修改app/models/test_case.py,新增body_type字段,修改处我已经红框标注。
调整pydantic

之前我们的schema数据都存放在router下面,后来存在一些循环引入问题。所以我把请求入参这些数据都放到了models下面,特此说明一下。
添加配置
以往啊,我们很喜欢写1,2,3,4:
if case_type == 1:
这种代码,但其实这种东西完全可以放到config里面,这样的话我们如果要变换对应的规则,就很方便,而且看1,2,3,4还不好回忆这是什么类型。
今次,我一定要换。
在class Config下面新增子类: class BodyType:

改造Http请求客户端
由于我们发json也好,form也好,改变的一般是这个方法:

类似这样的,如今我们多了一个新的参数,我打算封装一个新的方法,因为这块http在线请求需要用到,而case的执行也得用到。
话不多说,我们直接上代码:

这边普通form的话,data接收的是一个dict,json的话采用json去接收数据,而文件这种,则采用FormData:
由于我们存储body里面带有oss的文件信息,我们需要先解析一下数据,也就是先反序列化,接着取对应的文件或者文本,组成FormData。
- 运行case相关改动

之前我们有为json类型请求添加header的操作,如今都放到http client里面去做了,所以这边可以稍微简化下。
- replace_body改动

这里需要稍微改动下,只有json类型的时候才替换body的数据,因为目前这个替换只支持字典类型。
前端部分
前端部分我写的太烂了,有兴趣去看下源码吧(我自己都看不下去),活生生的屎山,真的。
不过我还是各种土方法给解决了,http那块我打算就到此为止了。
我加了一个可编辑表格的组件,这个与之前的有不同,因为这个组件需要根据选择的是FILE还是TEXT来决定VALUE单元格的输入控件:

这里切换为TEXT后,右侧的选择框会变成输入框。

可以看到,我们调用自己的http上传文件方法(upload),完成了文件上传的测试功能(如果能重来,我肯定不肝这个,太累了,bug小王子。)
测试平台系列(92) 让http请求支持文件上传的更多相关文章
- java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多
java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 也仿照着 netty处理了NIO的空轮询BUG 本项目并不复杂 代码不多 ...
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; import java.io.Un ...
- Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)
Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie) 一.HttpRequest对象 #HttpRequest ...
- 使用HttpClient 发送 GET、POST(FormData、Raw)、PUT、Delete请求及文件上传
httpclient4.3.6 package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; i ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- RPC基于http协议通过netty支持文件上传下载
本人在中间件研发组(主要开发RPC),近期遇到一个需求:RPC基于http协议通过netty支持文件上传下载 经过一系列的资料查找学习,终于实现了该功能 通过netty实现文件上传下载,主要在编解码时 ...
- Openresty + nginx-upload-module支持文件上传
0. 说明 这种方式其实复杂,麻烦!建议通过这个方式搭建Openresty文件上传和下载服务器:http://www.cnblogs.com/lujiango/p/9056680.html 1. 包下 ...
- SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传
由于项目需要调用其他微服务的数据,首先想到的就是写一个http网络请求的工具类,但是想到在之前看springCloud的时候里面有这个Fegin可以实现,就顺便实践一下,虽然过程有点坎坷,好在都顺利解 ...
- 让nginx支持文件上传的几种模式
文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单.只有语言的差别, ...
随机推荐
- SpringBoot+Vue+mysql 搭建(二)node 和gulp环境的设置
安装node不再写 gulp 参考以下文档 https://blog.csdn.net/a599174211/article/details/82878095 1.使用npm命令安装,一下两个命 ...
- mysql 实现类似Oracle 或 db2 sequence
第一步:创建一个索引管理表,其中包含,索引名称.最小值.最大值.当前值.增量,并设置主键为索引名称. CREATE TABLE TB_SEQUENCE ( SEQ_NAME VARCHAR(50) N ...
- java-规约-集合
/** * 1 * @hashCode&equals的处理: * 1-只要覆写了equals,必须复写hashCode. * 2-因为Set存储的是不重复的对象,依据hashCode和equa ...
- 面试问题之计算机网络:OSI七层网络模型及相关协议
一.应用层 功能:为应用程序提供服务并规定应用程序中通信相关的细节: 包括的协议如下: 1.超文本传输协议HTTP:这是一种基本的客户机/服务器的访问协议:浏览器向服务器发送请求,而服务器会应相应的网 ...
- AOP——基于AspectJ的注解来实现AOP操作
1.使用注解方式实现AOP操作 第一步:创建对象 <!-- 创建对象 --> <bean id="book" class="com.bjxb.aop.B ...
- ES6-11学习笔记--类与继承
ES5 中的类与继承: 类的定义: function People(name, age) { // this指向当前实例化对象 console.log(this); // 实例属性 this.name ...
- onActivityResult执行两次问题
差点被坑死 记一次onActivityResult被调用两次的坑
- 论文阅读总结-Patient clustering improves efficiency of federated machine learning to predict mortality and hospital stay time using distributed electronic medical records
一.论文提出的方法: 使用进入ICU前48h的用药特征作为预测因子预测重症监护患者的死亡率和ICU住院时间. 用到了联邦学习,自编码器,k-means聚类算法,社区检测. 数据集:从50家患者人数超过 ...
- JDBC/Mybatis连接数据库报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
造成这个的原因是maven导入MyBatis的时候会自动导入最新版本的8.0.11,然后8.0.11采用了新驱动,之前版本会报错. 当我们使用高版本的MySQL驱动时可以在获取数据库的连接getCon ...
- 浅谈arguments属性callee
1.首先 arguments 是一个对应于传递给函数的参数的类数组对象 2. arguments.callee 属性包含当前正在执行的函数. 描述 callee 是 arguments 对象的一个属性 ...