在烧瓶应用程序中单元测试同时请求

时间:2020-12-22 23:16:28

标签: multithreading unit-testing flask python-asyncio

我正在尝试制作一个用于控制相机的网站,我需要检查一下相机是否正忙(其他用户已在访问)。更具体地说,我正在测试在 post-request 期间运行的这段代码:

def try_capture_image(self, image_path, raw_file_path=None):
    if self.is_busy:
        raise ImageCaptureError("Camera is already in use")
    self.is_busy = True
    self.capture_image(image_path, raw_file_path)
    self.is_busy = False

self.capture_image 可能需要相当长的时间。

我正在尝试为此代码编写单元测试,但我不太确定该怎么做。现在我正在尝试在一个单独的线程中运行应用程序,同时执行两个同时发布的请求,如下所示:

    def test_camera_busy(self):
        def start_and_init_server(app):
            app.run(threaded=True)

        server_thread = threading.Thread(target=start_and_init_server, args=(self.app, ))
        server_thread.daemon = True  # This will stop the thread when process is finished
        server_thread.start()

        self.run_create_album_request()

        async def func1():
            return requests.post(
                SERVER_URL + "/albums/album1"
            ).json()

        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        group = asyncio.gather(func1(), func1())
        results = loop.run_until_complete(group)
        loop.close()

        print(results)

打印的响应是:

[{'image_url': '/tmpslbk6b55/albums/album1/images/image0001.png', 'success': 'Image successfully captured', 'thumbnail_url': '/tmpslbk6b55/albums/album1/thumbnails/image0001.jpg'}, {'image_url': '/tmpslbk6b55/albums/album1/images/image0002.png', 'success': 'Image successfully captured', 'thumbnail_url': '/tmpslbk6b55/albums/album1/thumbnails/image0002.jpg'}]

因此即使服务器以 threaded=True 启动,请求也不会并行运行。当手动运行服务器(并从不同设备执行两个请求)时,is-busy 机制工作正常,所以我不明白为什么在测试时请求按顺序运行。

有人知道发生了什么吗?或者对更好的测试方法的建议?任何帮助表示赞赏:)

0 个答案:

没有答案