zl程序教程

您现在的位置是:首页 >  其他

当前栏目

接口自动化测试 —— 文件上传/下载

2023-09-14 09:11:11 时间

阅读本文大概需要4分钟。

我们在做接口自动化测试的时候,经常会碰到文件上传接口文件下载接口

那么,文件接口跟普通接口有什么区别呢?又该如何实现呢?

〇、前言

文件上传/下载接口普通接口类似,但是有细微的区别。

如果需要发送文件到服务器,例如:上传文档、图片、视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: multipart/form-data 数据类型,可以发送文件,也可以发送相关的消息体数据。

反之,文件下载就是将二进制格式的响应内容存储到本地,并根据需要下载的文件格式来写文件名,例如:F:/caituotuo-file.pdf。

一、文件上传接口

1. 接口文档

Request URL:/createfile

Request Method:POST

Content-Type:multipart/form-data

名称类型是否必须描述
fileFile文件
titleString文件名称
fileTypeString文件类型:doc, docx, txt, pdf, png, gif, jpg, jpeg, tiff, html, rtf, xls, txt

2. 代码实现

(1)实现步骤:

  1. 构造文件数据,通过open()函数以二进制方式打开文件

    文件上传接口参数与普通post请求一样,需要写成Key和Value模式,Key为参数名称file(也是组件的name属性),Value为一个元组(与普通接口不同的地方)

    "file": (
        "caituotuo-file.pdf", # 元组第一个值为文件名称,没有则取None
        open(r"F:\caituotuo-file.pdf", "rb"), # 若第一个值非None,则取文件open打开的二进制流,否则直接写文件路径,如"F:\caituotuo-file.pdf"
        "pdf" # 文件类型
    )
    
    "file": (
        None,
        "F:\caituotuo-file.pdf"
    )
    
  2. 构造其他数据

    {
        "title": "接口上传的文件",
        "fileType": "pdf"
    }
    
  3. 发送请求,将文件数据以  files 参数传入,其他消息体数据通过 data 、 headers 、 cookies 等传入

    req = {
                "url": "127.0.0.1/createfile",
                "method": "POST",
                "headers": {},
                "files": {"file": ("caituotuo-file.pdf", open(r"F:\caituotuo-file.pdf", "rb"), "pdf")},
                "data": {
                    "title": "接口上传的文件",
                    "fileType": "pdf"
                }
            }
    

(2)完整代码

# -*- coding:utf-8 -*-
# 作者:测试蔡坨坨
# 时间:2022/3/12 21:04
# 功能:上传文件demo

import requests


class Createfile:
    
    def createfile(self):
        req = {
            "url": "127.0.0.1/createfile",
            "method": "POST",
            "headers": {},
            "files": {"file": ("", open(r"F:\caituotuo-file.pdf", "rb"), "pdf")},
            "data": {
                "title": "接口上传的文件",
                "fileType": "pdf"
            }
        }
        res = requests.request(**req)
        assert res.status_code == 200
        res_json = res.json()
        return res_json["result"]["id"]


if __name__ == '__main__':
    Createfile().createfile()

二、文件下载接口

1. 接口文档

Request URL:/download

Request Method:GET

名称类型是否必须描述
idLong文件组id
downloadItemsString[]下载可选项
needCompressForOneFileBoolean是,默认单文件也压缩当下载的文件仅一份时,是否压缩

2. 代码实现

# -*- coding:utf-8 -*-
# 作者:测试蔡坨坨
# 时间:2022/4/5 2:56
# 功能:下载文件demo

import requests


class Download:
    def download(self):
        req = {
            "url": "127.0.0.1/download",
            "method": "GET",
            "headers": {},
            "params": {
                "id": 2947403045981869536,
                "downloadItems": ["NORMAL"],
                "needCompressForOneFile": False
            },
        }
        res = requests.request(**req).content # 注意“.content"获取返回内容
        # with open("F:/response.zip", "wb") as f: # 多份文件返回压缩包
        with open("F:/response.pdf", "wb") as f:
            f.write(res)
        return res


if __name__ == '__main__':
    Download().download()

以上,完。脚踏实地,仰望星空,和小码哥一起学习软件测试,升职加薪!

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些对想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……