大家好~我是米洛

我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持。

欢迎关注我的公众号米洛的测开日记,获取最新文章教程!

回顾

上一节呢,我们编写了oss的客户端这块内容。但其实我们是有目的的,我们知道,我们有时候测试一些接口,比方说: 批量导入商品,这种情况下,我们是要给接口发送一个文件(excel或者csv)。

那怎么保管我们的测试数据呢,那就该oss发挥它的作用了。以往我们做测试,都会放一个目录保存测试数据,现在只不过是把数据放到了oss之中,其实道理都一样。

今天我们就来实现http请求支持oss文件上传。在此之前我们先得修复几个bug(还挺多的,但只列一个典型)

bug警示

  • 没有断言数据的时候报错

测试平台系列(92) 让http请求支持文件上传 - 图1

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

效果图

测试平台系列(92) 让http请求支持文件上传 - 图2

测试平台系列(92) 让http请求支持文件上传 - 图3

思路

我们之前为了图方便,在有body的http请求里面,强行让http请求二选一:

  • 要么json
  • 要么form表单
    针对这样文件的形式,就没法二选一了,所以我们必须要存储一个字段:
    body_type,这个字段用来告诉我们body是什么类型的,也就对应这里的数据:

测试平台系列(92) 让http请求支持文件上传 - 图4

0代表none, 2代表form-data 1代表raw(json) 3代表x-www-form-urlencoded, 后续的依次排列。

所以我们要去用例加个body_type,并且默认为1(因为目前我们的接口类型大部分json的).

接着我们在http请求的时候,根据不同的数据类型返回不同的body即可。

新增字段body_type

测试平台系列(92) 让http请求支持文件上传 - 图5

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

调整pydantic

测试平台系列(92) 让http请求支持文件上传 - 图6

之前我们的schema数据都存放在router下面,后来存在一些循环引入问题。所以我把请求入参这些数据都放到了models下面,特此说明一下。

添加配置

以往啊,我们很喜欢写1,2,3,4:

  1. if case_type == 1:

这种代码,但其实这种东西完全可以放到config里面,这样的话我们如果要变换对应的规则,就很方便,而且看1,2,3,4还不好回忆这是什么类型。

今次,我一定要换。

在class Config下面新增子类: class BodyType:

测试平台系列(92) 让http请求支持文件上传 - 图7

改造Http请求客户端

由于我们发json也好,form也好,改变的一般是这个方法:

测试平台系列(92) 让http请求支持文件上传 - 图8

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

话不多说,我们直接上代码:

测试平台系列(92) 让http请求支持文件上传 - 图9

这边普通form的话,data接收的是一个dict,json的话采用json去接收数据,而文件这种,则采用FormData:

由于我们存储body里面带有oss的文件信息,我们需要先解析一下数据,也就是先反序列化,接着取对应的文件或者文本,组成FormData。

  • 运行case相关改动

测试平台系列(92) 让http请求支持文件上传 - 图10

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

  • replace_body改动

测试平台系列(92) 让http请求支持文件上传 - 图11

这里需要稍微改动下,只有json类型的时候才替换body的数据,因为目前这个替换只支持字典类型。

前端部分

前端部分我写的太烂了,有兴趣去看下源码吧(我自己都看不下去),活生生的屎山,真的。

不过我还是各种土方法给解决了,http那块我打算就到此为止了。

我加了一个可编辑表格的组件,这个与之前的有不同,因为这个组件需要根据选择的是FILE还是TEXT来决定VALUE单元格的输入控件:

测试平台系列(92) 让http请求支持文件上传 - 图12

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

测试平台系列(92) 让http请求支持文件上传 - 图13

可以看到,我们调用自己的http上传文件方法(upload),完成了文件上传的测试功能(如果能重来,我肯定不肝这个,太累了,bug小王子。)