我应该啥时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?

Posted

技术标签:

【中文标题】我应该啥时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?【英文标题】:When should I execute unit tests and integration tests in a Dockerfile with Flask installed?我应该什么时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试? 【发布时间】:2019-10-25 17:27:16 【问题描述】:

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

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

我想在docker build 期间执行它们,以便将测试的执行放在 Dockerfile 中。对吗?

【问题讨论】:

【参考方案1】:

单元测试:在 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 调用来执行某些特定任务.

【讨论】:

以上是关于我应该啥时候在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?的主要内容,如果未能解决你的问题,请参考以下文章

docker 部署 flask高级编写及生成镜像,安装requirements.txt

Flask+MySQL+Redis的Docker配置

Flask+MySQL+Redis的Docker配置

Docker和tomcat有啥关系呢

Docker Compose安装与创建Flask web应用

使用docker容器安装nginx的使用