什么时候应该在安装了 Flask 的 Dockerfile 中执行单元测试和集成测试?
When should I execute unit tests and integration tests in a Dockerfile with Flask installed?
我设置了一个新的 Flask Python 服务器,并用我的所有代码创建了一个 Dockerfile。我已经编写了一些单元测试并在本地执行它们。如果我想实现一个CI/CD,我应该什么时候执行它们?
我还需要编写集成测试(测试我是否正确查询数据库,了解端点是否正确公开,等等),我应该什么时候在 CI/CD 中执行它们?
我想在 docker build
期间执行它们,以便将测试的执行放在 Dockerfile 中。正确吗?
单元测试: 在 Docker 之外,在你 运行 你的 docker build
之前。在您的 CI 管道中,在检查源代码并 运行 任何安装步骤(如安装包依赖项)之后。
集成测试: 从 Docker 外部启动;取决于您的设置有多复杂,可以在您的 CI 管道后期或作为您的 CD 管道的一部分。
这假设一个真正的 "unit test" 没有外部依赖;它仅依赖于 application/library 代码,并且在需要数据库之类的地方时,它要么模拟这些依赖项,要么使用诸如嵌入式 SQLite 之类的东西。 (一些框架在这个工作流程中特别糟糕,如果数据库不可用,则根本无法启动应用程序。但是 Rails 在 Python 上不会 运行。)
运行 Docker 文件中的单元测试将持续到午夜,您遇到生产中断,并且您的快速修复将使站点恢复正常,但碰巧破坏了一个晦涩的单元测试,否则您不能等待 5 分钟的循环时间 运行 整个 unit-test 套件。因为在你的单元测试中不应该依赖于 Docker-or-not 环境,所以我只是 运行 它们在 Docker.
之外
通常,您可以建立足够的基础架构,以便能够 运行 您的应用程序 "for real" 使用几个 docker run
命令或一个简单的 Docker Compose 设置。在这种情况下,运行 在 CI 管道结束时进行集成测试是有意义的。对于更复杂的设置(可能涉及 Kubernetes),您可能需要实际部署到测试环境中,如果您有单独的 CI 和 CD 工具,这将变成 "test deploy"、"integration test", "pre-production deploy".
作为一名开发人员,我发现工具 not-in-Docker 比 Docker 中只有 运行 的工具更容易管理。 (我不赞成 "any binary other than /usr/bin/docker
is bad" 哲学。)我宁愿只 运行 pytest
或 curl
而不是记住 4 行 docker run
调用做一些特定的任务。
我设置了一个新的 Flask Python 服务器,并用我的所有代码创建了一个 Dockerfile。我已经编写了一些单元测试并在本地执行它们。如果我想实现一个CI/CD,我应该什么时候执行它们?
我还需要编写集成测试(测试我是否正确查询数据库,了解端点是否正确公开,等等),我应该什么时候在 CI/CD 中执行它们?
我想在 docker build
期间执行它们,以便将测试的执行放在 Dockerfile 中。正确吗?
单元测试: 在 Docker 之外,在你 运行 你的 docker build
之前。在您的 CI 管道中,在检查源代码并 运行 任何安装步骤(如安装包依赖项)之后。
集成测试: 从 Docker 外部启动;取决于您的设置有多复杂,可以在您的 CI 管道后期或作为您的 CD 管道的一部分。
这假设一个真正的 "unit test" 没有外部依赖;它仅依赖于 application/library 代码,并且在需要数据库之类的地方时,它要么模拟这些依赖项,要么使用诸如嵌入式 SQLite 之类的东西。 (一些框架在这个工作流程中特别糟糕,如果数据库不可用,则根本无法启动应用程序。但是 Rails 在 Python 上不会 运行。)
运行 Docker 文件中的单元测试将持续到午夜,您遇到生产中断,并且您的快速修复将使站点恢复正常,但碰巧破坏了一个晦涩的单元测试,否则您不能等待 5 分钟的循环时间 运行 整个 unit-test 套件。因为在你的单元测试中不应该依赖于 Docker-or-not 环境,所以我只是 运行 它们在 Docker.
之外通常,您可以建立足够的基础架构,以便能够 运行 您的应用程序 "for real" 使用几个 docker run
命令或一个简单的 Docker Compose 设置。在这种情况下,运行 在 CI 管道结束时进行集成测试是有意义的。对于更复杂的设置(可能涉及 Kubernetes),您可能需要实际部署到测试环境中,如果您有单独的 CI 和 CD 工具,这将变成 "test deploy"、"integration test", "pre-production deploy".
作为一名开发人员,我发现工具 not-in-Docker 比 Docker 中只有 运行 的工具更容易管理。 (我不赞成 "any binary other than /usr/bin/docker
is bad" 哲学。)我宁愿只 运行 pytest
或 curl
而不是记住 4 行 docker run
调用做一些特定的任务。