如何为Docker部署的Django应用通过Jenkins运行Selenium测试
Django + Jenkins + Docker 环境下Selenium集成测试最佳实践
核心问题解决方案
1. 解决Selenium测试依赖服务启动的问题
Selenium集成测试需要整套应用环境运行才能执行,因此需将测试环节从Docker镜像构建阶段剥离,调整到镜像构建完成后、推送至私有仓库前执行:
- 借助
docker-compose临时编排整套测试环境,包含Django应用容器、依赖的数据库/缓存中间件容器、Selenium独立浏览器容器(如selenium/standalone-chrome) - 增加服务健康检查逻辑,用
curl轮询Django服务端口,确认服务正常启动后再执行测试
2. 容器内执行测试的最优方案
不建议在Dockerfile内部调用测试脚本,原因如下:
- Docker build阶段无法启动依赖服务,不满足Selenium测试的运行前提
- 测试逻辑和生产镜像耦合会增大镜像体积,且测试失败会直接中断镜像构建,无法做后续的结果判定
推荐方案: - 测试命令通过
docker exec执行:应用容器启动并通过健康检查后,执行docker exec <Django容器名称> 测试命令触发Selenium测试,测试报告输出到容器内固定目录(如/app/test_reports/) - 如果不想生产镜像携带pytest、coverage等测试依赖,可以基于生产镜像额外构建一层测试专用镜像,安装完测试依赖后再执行测试,生产镜像保持纯净
3. Jenkins获取容器内测试报告的方案
根据测试执行环境的不同,对应两种方案:
- 测试在Jenkins构建节点执行:测试完成后执行
docker cp <Django容器名称>:/app/test_reports/ ./,将容器内的报告直接拷贝到Jenkins当前工作目录即可 - 测试在远程开发服务器执行:测试完成后执行
scp <远程服务器账号>@<远程服务器IP>:/远程服务器上的报告路径/* ./,将报告同步回Jenkins工作目录
Jenkins可直接读取工作目录下的Cobertura、Junit格式报告做结果解析和展示。
调整后的部署流程
- Jenkins从GIT拉取代码
- 构建Django生产镜像
- 临时启动测试环境:通过docker-compose拉起Django应用、依赖中间件、Selenium浏览器容器,等待服务健康检查通过
- 执行Selenium测试,将报告从容器内同步到Jenkins工作目录
- Jenkins解析测试报告,判断测试结果:
- 测试失败:直接终止流程,清理临时测试环境,镜像不推送至私有仓库
- 测试通过:清理临时测试环境,将生产镜像推送至私有Docker镜像仓库
- 登录远程开发服务器,拉取对应版本镜像
- 远程服务器运行镜像启动服务
补充优化建议
- 固定测试报告的输出路径,避免同步/拷贝时出现文件找不到的问题
- 增加Jenkins后置清理步骤,无论测试成功失败都删除临时容器、网络、存储卷,避免节点资源被占用
- 测试用例和应用代码一同打包到镜像中,保证测试用例版本和应用版本完全一致
内容的提问来源于stack exchange,提问作者Marko Zadravec
相关产品推荐
相关产品推荐

