我正在使用 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/