我正在开发一个API,当用户上传一个文件时,它会动态地处理这个文件,从中提取一些数据。该文件可以相当大(高达5GB),并且不会在服务器上持久化。
我有很多使用由水瓶提供的通用测试设施的系统测试。我也知道如何将测试上传为一个文件。
但是,有一种情况我还没有在系统测试中讨论过。如果用户开始上传一个文件,然后将连接放在中间,而服务器正在忙着从它已经收到的数据中提取数据,那该怎么办?
我通过启动一个大文件并在中间终止客户机来玩curl
。API的行为似乎符合我的预期。但我更喜欢完全自动化的方法。
我怎么能这么做?有什么东西可以让我做这样的测试吗?如果不是,什么是可行的办法?
发布于 2018-08-25 05:20:45
在搜索了一段时间之后,似乎没有任何一个测试功能,或者请求库可以帮助我。因此,解决方案是使用Python套接字执行手动HTTP请求。
为了节省时间,模拟请求和研究实际发送的内容的最简单方法是使用带有一些附加参数的curl
:
--trace-ascii -
使得显示curl
发送和接收的所有内容成为可能。非常方便。--limit-rate 3K
帮助模拟了一个非常慢的连接,结合gunicorn
(gunicorn --timeout 2 ...
)中的超时配置,可以再现客户机启动POSTing文件,然后挂起太长时间的情况。从那里开始,我只需复制curl
的行为,因为它在终端中将它报告给使用socket.socket()
的测试代码。
然后,通过线程将测试代码流到服务器,同时定期暂停并将其进度报告给主线程。当文件的一部分(但不是全部)被发送时,主线程将突然终止正在流文件的线程。然后,它就会等待gunicorn超时,然后与数据库交互,以检查处理是否按预期进行。
我不知道的一件事是,Werkzeug缓冲请求,这是完全不直观的,因为在使用werkzeug.formparser.parse_form_data()
时,每次遇到换行符时都会调用传递给Werkzeug的流的write
方法。诀窍是,它首先被缓冲,并且只有当缓冲区已满时,才会开始为缓冲区中的数据调用write
。最初,我只发送包含几千字节的文件,所以看起来Werkzeug只是在内存中读取整个文件,然后才允许我处理它。当我开始发送大于其65,536字节缓冲区的文件时,我注意到在缓冲区填充后,我在突发中得到了对write
的调用。
https://stackoverflow.com/questions/51812927
复制相似问题