【robotframework】使用RequestsLibrary的Get File For Streaming Upload关键字实现文件上传
昨天组内成员遇到一问题找到我,说使用RequestsLibrary调测上传接口的时候,接口一直提示文件格式错误,她和另外一名同事琢磨了很久,没搞定,于是找到我这边。该同事的描述就是“我使用postman是好的呀,通过关键字上传就不行了”。昨天由于有更高优先级的任务,于是今天上午帮该同事看了一下,经过几次尝试,问题解决,本文主要记录下问题现象以及解决过程。
最开始编写的用例:
*** Settings ***
Library Collections
Library RequestsLibrary
Library OperatingSystem
*** Variables ***
${BASE_URL} http://xx.xx.xx.xx
*** Test Cases ***
文件上传测试-POST
[Documentation] 文件上传测试-POST
Create Session file_upload ${BASE_URL} verify=True
# 打开文件
${file_data}= Get Binary File D:/test01.xlsx
# 文件参数
&{file_parts}= Create Dictionary
Set To Dictionary ${file_parts} test01.xlsx=${file_data}
# 文件上传参数
${resp}= Post On Session file_upload /basic/file/upload files=${file_parts}
执行该用例后,接口报如下错误:

查看发送的报文,发现如下信息:

于是将用例中的test01.xlsx=${file_data} 修改为file=${file_data}后,用例如下:
*** Settings ***
Library Collections
Library RequestsLibrary
Library OperatingSystem
*** Variables ***
${BASE_URL} http://xx.xx.xx.xx
*** Test Cases ***
文件上传测试-POST
[Documentation] 文件上传测试-POST
Create Session file_upload ${BASE_URL} verify=True
# 打开文件
${file_data}= Get Binary File D:/test01.xlsx
# 文件参数
&{file_parts}= Create Dictionary
Set To Dictionary ${file_parts} file=${file_data}
# 文件上传参数
${resp}= Post On Session file_upload /basic/file/upload files=${file_parts}
执行该用例后,报新的错误:

查看日志中发送的报文,发现如下信息:

POST报文中Cotent-Diposition头域中的filename也变成file了,应该是具体的文件名才对
于是谷歌了一把,在https://forum.robotframework.org/t/facing-issue-with-testing-file-upload-api-using-robot-framework/254中找到了如下信息:

于是将原先测试用例中的Get Binary File关键字替换成Get File For Streaming Upload关键字:
*** Settings ***
Library Collections
Library RequestsLibrary
Library OperatingSystem
*** Variables ***
${BASE_URL} http://106.12.185.21
*** Test Cases ***
文件上传测试-POST
[Documentation] 文件上传测试-POST
Create Session file_upload ${BASE_URL} verify=True
# 打开文件
${file_data}= Get File For Streaming Upload D:/test01.xlsx
# 文件参数
&{file_parts}= Create Dictionary
Set To Dictionary ${file_parts} file=${file_data}
# 文件上传参数
${resp}= Post On Session file_upload /basic/file/upload files=${file_parts}
再次尝试,问题解决:

请求报文如下:

RequestsLibrary库中的Get File For Streaming Upload关键字帮助信息如下:

浙公网安备 33010602011771号