python - 测试具有某些代码的函数依赖于在本地测试期间不可用的服务?

标签 python docker testing pytest mqtt

我正在使用 pytest测试 Flask也使用 MQTT 的 API .我迟到了 TDD 游戏,所以这个问题很可能在其他地方得到回答,但我想不出构建它的正确方法,所以找不到任何似乎可以为我回答的问题。 This question在集成测试期间处理模拟听起来像是在正确的轨道上。

基本上我的一个测试是这样的

response = testing_client.post(
         "/api/users/1/devices",
         data=json.dumps(dict(device)),
         headers={"Authorization": "Token %s" % auth_token},
         content_type="application/json",
     )
assert response.status_code == 200

问题是处理这些 POST 请求的相应代码位也会在处理请求后发布 MQTT 消息,即

publish.single(f"{device_id}/active", msg, hostname=os.environ.get("MQTT_BROKER_URL"), retain=True, qos=0, port=int(os.environ.get("MQTT_BROKER_PORT")))

API 和 MQTT 代理是使用 Docker 组合管理的独立容器。当我在本地测试时,没有 MQTT 代理在运行,因此这里的任何测试都会失败(即使我实际上并不关心测试 MQTT 代码)。

对于对数据库 (Postgres) 的任何调用,我实际上设置了一个特定的 postgres 容器用于测试并针对它运行测试。我应该为 MQTT 测试做同样的事情(然后我还必须在 GitLab 上的 CI 管道期间做它),还是我缺少更明显的解决方案?

最佳答案

您绝对应该模拟测试并创建模拟返回值。想象一下有 100 个执行 HTTP 请求的测试,这在您的持续集成进程中变得太慢了(扩展得非常糟糕)。

您的代码应该处理请求失败和成功的情况。对于一种情况,您将结果 mock 为成功,而在另一种情况下,您将结果 mock 为失败。然后测试您的代码如何与结果交互。

monkeypatch.setattr("testing_client.post", lambda *args: some_return_value)

关于python - 测试具有某些代码的函数依赖于在本地测试期间不可用的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312380/

相关文章:

javascript - Promise.all, webdriver.promise.all, protractor.promise.all 的区别

python - PyQt 将graphicsScene 对象分组为一个对象

mysql - TCPConnectWrap.afterConnect - Node 在 docker compose 中时无法从 mysql 获取数据

docker - 我的python图像这么大,我做错了什么

testing - 在 GET 和 DELETE 采样器之间分组采样器

testing - 建立一个网络开发人员实验室用于学习目的

python - 使用 SQLAlchemy 批量更新

python - 删除时django-dynamic-formset问题

python - 如何检查类成员是否存在而不会出现异常

docker - 使用 Docker 映射 Compute Engine 中的端口