首页 > 解决方案 > 我应该什么时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?

问题描述

我设置了一个新的 Flask Python 服务器,并使用我的所有代码创建了一个 Dockerfile。我已经编写了一些单元测试,并在本地执行它们。如果我想实现 CI/CD,我应该什么时候执行它们?

我还需要编写集成测试(以测试我是否正确查询数据库,了解端点是否正确公开,等等),我应该何时在 CI/CD 中执行它们?

我正在考虑在此期间执行它们,docker build以便将测试的执行放在 Dockerfile 中。这是对的吗?

标签: unit-testingdockerintegration-testing

解决方案


单元测试:在 Docker 之外,在运行docker build. 在您的 CI 管道中,在检查源代码并运行任何设置步骤(如安装包依赖项)之后。

集成测试:从 Docker 外部启动;取决于您的设置有多复杂,无论是在 CI 管道的后期还是作为 CD 管道的一部分。

这假设一个真正的“单元测试”没有外部依赖;它仅取决于应用程序/库代码,并且在需要数据库之类的东西的地方,它要么模拟出这些依赖关系,要么使用嵌入式 SQLite 之类的东西。(一些框架在这个工作流程上特别糟糕,如果数据库不可用,根本无法启动应用程序。但是 Rails 不能在 Python 上运行。)

在 Dockerfile 中运行单元测试将持续到午夜,您的生产中断,并且您的快速修复将恢复站点恰好破坏了一个晦涩的单元测试,或者您无法等待 5 分钟的循环时间运行整个单元测试套件。因为在你的单元测试中不应该依赖于 Docker-or-not 环境,所以我只是在 Docker 之外运行它们。

通常,您可以建立足够的基础设施,以便能够通过几个docker run命令或简单的 Docker Compose 设置“真正地”运行您的应用程序。在这种情况下,在 CI 管道的末尾运行集成测试是有意义的。使用更复杂的设置(可能涉及 Kubernetes),您可能需要实际部署到测试环境中,如果您有单独的 CI 和 CD 工具,这将变成“测试部署”、“集成测试”、“预生产”部署”。

作为一名开发人员,我发现拥有非 Docker 中的工具比仅在 Docker 中运行的工具更容易管理。(我不赞同“除了/usr/bin/docker坏的任何二进制”哲学。)我宁愿只运行pytestcurl记住 4 行docker run调用来执行某些特定任务。


推荐阅读