如何测试Flask应用是否能够正确处理中断的上传?

时间:2018-08-12 21:16:37

标签: python flask automation system-testing

我正在开发一个API,当用户上传文件时,该API会动态处理该文件以从中提取一些数据。该文件可能很大(最大5 GB),并且不能持久保存在服务器上。

我有很多使用common test facility provided by Flask的系统测试。我也知道如何make the test upload a file

但是,在某些情况下,系统测试并未涵盖我。如果用户开始上载文件,然后在服务器正忙于从已接收的数据中提取数据的同时断开连接,该怎么办?

我通过启动一个大文件并在其中途终止客户端来与curl一起玩。该API的行为似乎符合我的期望。但是我更喜欢一种完全自动化的方法。

我该怎么做? Flask或Werkzeug中是否有什么可以让我执行这样的测试?如果没有,什么是可行的方法?

1 个答案:

答案 0 :(得分:0)

搜索了一段时间后,似乎Flask的测试功能和Requests library都无法帮助我。因此,解决方案是使用Python's sockets进行手动HTTP请求。

为了节省时间,模拟请求并研究实际发送的内容的最简单方法是使用curl和一些其他参数:

  • --trace-ascii -使得可以显示curl发送和接收的所有内容。非常方便。

  • --limit-rate 3K帮助模拟了一个非常慢的连接,结合gunicorngunicorn --timeout 2 ...)中的超时配置,可以重现客户端开始发布文件的情况,然后挂了太久。

从那里,我只需要复制curl的行为(它在终端中报告该行为)到使用socket.socket()的测试代码。

然后,测试代码通过一个线程将文件流传输到服务器,同时进行常规暂停并将其进度报告给主线程。当发送文件的一部分而不是全部时,主线程将突然终止正在传输文件的线程。然后它将等待足够长的时间让Gunicorn超时,然后与数据库进行交互以检查处理是否按预期进行。

我不知道的一件事是Werkzeug缓冲了请求,这绝对不直观,因为使用werkzeug.formparser.parse_form_data()时,每次传递给Werkzeug的流的方法write都会被调用遇到换行符。诀窍是首先对其进行缓冲,只有当缓冲区已满时,才开始为缓冲区中的数据调用write。最初,我只发送包含几千字节的文件,因此看起来Werkzeug只是在读取内存中的整个文件,然后才让我对其进行处理。当我开始发送大于其65,536字节缓冲区的文件时,我注意到在缓冲区被填满后,我突然收到了对write的调用。