如何使用Skaffold对依赖K8s ConfigMap和Secret的微服务执行单元测试
Skaffold 运行依赖K8s配置的单元测试解决方案
Skaffold 默认的前置部署测试是在镜像构建阶段、资源还未部署到集群时执行,自然无法读取集群内的ConfigMap和Secret,可通过两种方案解决:
- 方案1:调整测试为部署后执行
修改skaffold.yaml的测试配置,指定测试在集群资源部署完成后运行,此时测试可直接访问当前集群内的所有配置资源,配置示例如下:test: - image: 你的微服务镜像名 context: . custom: # 替换为对应语言的单元测试执行命令 command: ["go", "test", "./..."] dependencies: paths: - "**/*.go" # 替换为你的代码文件匹配规则 # 配置为部署后执行测试 runMode: RunModePostDeploy - 方案2:构建阶段本地注入测试配置
如果需要在部署前完成测试,可以把单元测试需要的非敏感配置写在本地测试配置文件,敏感参数从本地环境变量注入,修改Skaffold测试配置传递参数即可:
该方案不需要依赖集群资源,适合仅测试业务逻辑、不需要调用集群内其他服务的场景。test: - image: 你的微服务镜像名 context: . env: - name: DB_HOST value: "localhost" - name: DB_PASSWORD value: "{{.LOCAL_DB_PWD}}" # 从运行Skaffold的本地环境变量读取敏感值 custom: command: ["go", "test", "./..."]
微服务单元测试常规执行方案
- 分层拆分测试类型
将单元测试拆分为两类分开执行:- 纯逻辑单元测试:仅测试单个函数、类的业务逻辑,所有外部依赖(配置、数据库、第三方接口)全部用Mock工具模拟,不需要依赖任何外部资源,放在CI最前置阶段执行,提前发现代码逻辑问题
- 集成单元测试:测试多个模块、服务和外部资源的交互逻辑,需要依赖配置、数据库等外部资源,放在部署到测试集群之后执行
- 代码层配置解耦
代码层面做配置层抽象,支持动态切换配置源:部署环境从K8s ConfigMap/Secret读取配置,测试环境从本地配置文件、环境变量读取配置,避免测试逻辑绑定集群资源 - 流水线执行顺序
常规CI/CD流水线的测试执行顺序为:- 代码提交后先执行纯逻辑单元测试,不需要构建镜像即可运行
- 镜像构建完成后执行镜像基线测试,验证镜像基础可用性
- 部署到测试集群后执行集成单元测试、接口测试,此时可访问集群内所有配置和依赖资源
- 所有测试通过后再发布到生产环境
内容的提问来源于stack exchange,提问作者WIlliam
相关产品推荐
相关产品推荐

