如何测试 Flask 应用程序是否正确处理中断的上传?
How to test if Flask app handles correctly interrupted uploads?
我正在研究 API,当用户上传文件时,它会即时处理该文件以从中提取一些数据。该文件可能非常大(最多 5 GB)并且不会保留在服务器上。
我有一堆使用 common test facility provided by Flask. I also know how to make the test upload a file.
的系统测试
但是,有一种情况我没有被系统测试覆盖。如果用户开始上传文件,然后在中途断开连接,而服务器正忙于从已收到的数据中提取数据,该怎么办?
我通过启动一个大文件并在事情中间终止客户端来玩 curl
。 API 似乎符合我的预期。但我更喜欢完全自动化的方法。
我该怎么做? Flask 或 Werkzeug 中有什么东西可以让我执行这样的测试吗?如果不是,什么是可行的方法?
找了一会,好像Flask的测试功能都没有,Requests library could help me. The solution was therefore to do a manual HTTP request with Python's sockets.
为了节省时间,模拟请求和研究实际发送的内容的最简单方法是使用 curl
和一些附加参数:
--trace-ascii -
可以显示 curl
发送和接收的所有内容。非常好用。
--limit-rate 3K
帮助模拟一个非常慢的连接,结合 gunicorn
(gunicorn --timeout 2 ...
) 中的超时配置允许重现客户端启动的情况正在发布一个文件,然后挂起太久。
从那里,我只需将 curl
在终端中报告的行为复制到使用 socket.socket()
.
的测试代码中
然后,测试代码通过线程将文件流式传输到服务器,同时定期暂停并向主线程报告其进度。当文件的一部分而非全部被发送时,主线程会突然终止流式传输文件的线程。然后它将等待 gunicorn 超时,然后与数据库交互以检查处理是否按预期进行。
我不知道的一件事是 Werkzeug 缓冲了请求,这绝对不直观,因为在使用 werkzeug.formparser.parse_form_data()
时,调用了传递给 Werkzeug 的流的方法 write
每次遇到换行符。诀窍是它首先被缓冲,只有当缓冲区满时,write
才开始为缓冲区中的数据调用。最初,我只发送包含几千字节的文件,所以看起来 Werkzeug 只是在内存中读取整个文件,然后才让我处理它。当我开始发送大于其 65,536 字节缓冲区的文件时,我注意到在缓冲区填满后我突然收到对 write
的调用。
我正在研究 API,当用户上传文件时,它会即时处理该文件以从中提取一些数据。该文件可能非常大(最多 5 GB)并且不会保留在服务器上。
我有一堆使用 common test facility provided by Flask. I also know how to make the test upload a file.
的系统测试但是,有一种情况我没有被系统测试覆盖。如果用户开始上传文件,然后在中途断开连接,而服务器正忙于从已收到的数据中提取数据,该怎么办?
我通过启动一个大文件并在事情中间终止客户端来玩 curl
。 API 似乎符合我的预期。但我更喜欢完全自动化的方法。
我该怎么做? Flask 或 Werkzeug 中有什么东西可以让我执行这样的测试吗?如果不是,什么是可行的方法?
找了一会,好像Flask的测试功能都没有,Requests library could help me. The solution was therefore to do a manual HTTP request with Python's sockets.
为了节省时间,模拟请求和研究实际发送的内容的最简单方法是使用 curl
和一些附加参数:
--trace-ascii -
可以显示curl
发送和接收的所有内容。非常好用。--limit-rate 3K
帮助模拟一个非常慢的连接,结合gunicorn
(gunicorn --timeout 2 ...
) 中的超时配置允许重现客户端启动的情况正在发布一个文件,然后挂起太久。
从那里,我只需将 curl
在终端中报告的行为复制到使用 socket.socket()
.
然后,测试代码通过线程将文件流式传输到服务器,同时定期暂停并向主线程报告其进度。当文件的一部分而非全部被发送时,主线程会突然终止流式传输文件的线程。然后它将等待 gunicorn 超时,然后与数据库交互以检查处理是否按预期进行。
我不知道的一件事是 Werkzeug 缓冲了请求,这绝对不直观,因为在使用 werkzeug.formparser.parse_form_data()
时,调用了传递给 Werkzeug 的流的方法 write
每次遇到换行符。诀窍是它首先被缓冲,只有当缓冲区满时,write
才开始为缓冲区中的数据调用。最初,我只发送包含几千字节的文件,所以看起来 Werkzeug 只是在内存中读取整个文件,然后才让我处理它。当我开始发送大于其 65,536 字节缓冲区的文件时,我注意到在缓冲区填满后我突然收到对 write
的调用。