unit-testing - 我应该什么时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?
问题描述
我设置了一个新的 Flask Python 服务器,并使用我的所有代码创建了一个 Dockerfile。我已经编写了一些单元测试,并在本地执行它们。如果我想实现 CI/CD,我应该什么时候执行它们?
我还需要编写集成测试(以测试我是否正确查询数据库,了解端点是否正确公开,等等),我应该何时在 CI/CD 中执行它们?
我正在考虑在此期间执行它们,docker build
以便将测试的执行放在 Dockerfile 中。这是对的吗?
解决方案
单元测试:在 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
坏的任何二进制”哲学。)我宁愿只运行pytest
或curl
记住 4 行docker run
调用来执行某些特定任务。
推荐阅读
- gitlab-ci - AWS SAM 在 GitLab CI/CD 中部署
- go - 从恐慌中恢复的程序未按预期退出
- vagrant - 在 Vagrant 中,如何仅在实际配置时填充配置环境变量?
- python - 带有“if”子句的列表理解如何工作?
- php - 如何修复“在 null 上调用成员函数 update()”错误?
- go - Go 惯用的类型转换函数命名
- html - HTML 敏捷包获取类
- reactjs - 如何在 react js 中创建单独的管理路由?
- django - 如果我将应用程序重新组织到应用程序文件夹,Django 无法识别应用程序的 __init__.py 中指定的包
- php - 用 DOM 获得的路径指向 php 中的播放器