我建立了一个新的Flask Python服务器,并用我的所有代码创建了一个Dockerfile。我已经编写了一些单元测试,并且正在本地执行它们。如果要实施CI / CD,应何时执行?
我还需要编写集成测试(以测试是否正确查询数据库,了解端点是否正确公开等等),什么时候应该在CI / CD中执行它们?
我当时正在考虑在docker build
期间执行它们,以便将测试的执行放入Dockerfile中。正确吗?
答案 0 :(得分: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
以外的任何二进制文件都是错误的。”)我宁愿只运行pytest
或curl
,也不记得4行{{1 }}调用以执行某些特定任务。