Robot Framework发送大体积二进制POST请求时OOM问题求助
解决Robot Framework大二进制文件POST上传OOM问题
你的问题核心在于**Get Binary File会把整个250MB文件一次性加载到内存中**,加上Python对象的额外内存开销,直接触发了OOM。而robotframework-requests的Post Request关键字默认会处理传入的data参数,无法直接利用requests原生的流式上传能力。下面是几个可行的解决方案:
方案1:直接调用底层requests.Session的流式上传
Robot Framework允许通过Call Method关键字直接调用requests.Session对象的原生方法,这样就能利用requests支持的文件对象流式上传(不会一次性读入整个文件)。修改后的测试用例如下:
Upload ${filename} file Create Session mysession http://${ADDRESS} &{headers} = Create Dictionary Content-Type=application/octet-stream Accept=application/octet-stream ${file_handle} = Open File ${filename} rb TRY ${resp} = Call Method ${mysession} post ${CGIPath} data=${file_handle} headers=&{headers} [Return] ${resp.status_code} ${resp.text} FINALLY Close File ${file_handle} END
关键说明:
Open File以二进制只读模式打开文件,返回的文件句柄可以直接传给requests的post方法- requests会自动分块读取文件并上传,内存占用仅维持在几MB级别
- 用
TRY/FINALLY确保文件句柄无论请求成功与否都会被关闭,避免资源泄漏
方案2:使用curl命令流式上传(备选)
如果不想修改Robot Framework的关键字调用逻辑,直接用Run Process执行curl命令也是稳定的选择——curl默认支持流式读取文件上传,内存开销极低:
Upload ${filename} file &{headers} = Create Dictionary Content-Type=application/octet-stream Accept=application/octet-stream # 拼接curl命令 ${curl_headers} = Catenate SEPARATOR=" " ... -H "Content-Type: ${headers}[Content-Type]" ... -H "Accept: ${headers}[Accept]" ${curl_cmd} = Catenate SEPARATOR=" " ... curl -X POST ... ${curl_headers} ... --data-binary @${filename} ... http://${ADDRESS}${CGIPath} # 执行命令并获取结果 ${result} = Run Process ${curl_cmd} shell=True # 解析返回值(根据实际响应格式调整) [Return] ${result.returncode} ${result.stdout}
关键说明:
--data-binary @${filename}告诉curl直接读取文件内容作为请求体,不会加载整个文件到内存- 需要注意解析curl的返回结果,比如从stdout中提取响应状态码和内容(如果接口返回的是JSON或文本)
你的测试疏漏点
你之前的测试用例最大的问题是没有利用HTTP客户端的流式上传能力,而是通过Get Binary File把大文件全量加载到内存,这对于百MB级别的文件来说是完全没必要的,也是OOM的直接诱因。robotframework-requests的Post Request关键字封装了requests的方法,但没有暴露流式上传的入口,所以需要绕开封装直接调用底层API。
内容的提问来源于stack exchange,提问作者UVV
相关产品推荐
相关产品推荐

