如何使用 Pytest 测试 dockerized Flask 应用程序?

azz*_*msa 6 python pytest flask docker

我已经构建了 Flask 应用程序,旨在在 docker 容器内运行。如果标头密钥与我放入docker-composeenvironment中的密钥匹配,它将接受 POST HTTP 方法并返回适当的 JSON 响应。

...
    environment:
      - SECRET_KEY=fakekey123
...
Run Code Online (Sandbox Code Playgroud)

问题是:当涉及到测试时。Flask (pytest)的appclient固定装置当然找不到 docker-compose environment。因为应用程序不是从 docker-compose 启动的,而是从 pytest 启动的。

...
    environment:
      - SECRET_KEY=fakekey123
...
Run Code Online (Sandbox Code Playgroud)

解决这个问题的(最佳/推荐)方法是什么?

我找到了一些插件 来做到这一点。但我在这里问是否有更“简单”/“通用”的方法。因为我还想使用 CI/CD 工具自动执行此测试。

Hol*_*ehg 5

您很可能需要py.test从容器内部运行。如果您在本地运行,那么主机所看到的内容和容器所看到的内容之间将会存在冲突。

所以选项#1 是使用docker exec

$ docker exec -it $containerid py.test
Run Code Online (Sandbox Code Playgroud)

那么选项 #2 将在您的脚本或任务中创建一个脚本或任务setup.py,以便您可以运行更简单的命令,例如:

$ python setup.py test
Run Code Online (Sandbox Code Playgroud)


azz*_*msa 0

我当前的解决方案是模拟读取操作系统环境的函数。如果应用程序开始使用 docker,则会加载 OS ENV。为了方便测试,我只是mock了这个函数。

   def fake_secret_key(self):
        return "ffakefake11"

    def test_app(self, client):
        app.secret_key = self.fake_secret_key
        # ^^ real func   ^^ fake func
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是使用pytest-env作为 @bufh 在评论中建议的。

创建pytest.ini文件,然后放入:

[pytest]
env =
    APP_KEY=ffakefake11

Run Code Online (Sandbox Code Playgroud)