news 2026/9/9 19:15:41

Kubernetes 如何用 make test-integration 运行 test/integration 集成测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kubernetes 如何用 make test-integration 运行 test/integration 集成测试

Kubernetes 如何用 make test-integration 运行 test/integration 集成测试

【免费下载链接】kubernetesProduction-Grade Container Scheduling and Management项目地址: https://gitcode.com/GitHub_Trending/kuber/kubernetes

在 Kubernetes 仓库中开发组件逻辑后,通常需要跑一轮集成测试来验证:这些测试位于各模块下的test/integration目录(如 test/integration/),它们会真实拉起一个本地 etcd 实例,在接近运行时的环境中执行 API 写入、控制器逻辑等操作,而不是仅跑单元测试。仓库提供了一个统一入口:make test-integration,它会自动准备 etcd、发现所有待测包、执行go test并在结束后清理环境。本文说明如何从准备 etcd 到完成一次完整的集成测试运行。

前提条件:etcd 必须在 PATH 中

集成测试依赖一个真实的 etcd 进程。hack/make-rules/test-integration.sh 在开始测试前会执行checkEtcdOnPath

  • 如果which etcd找不到 etcd,脚本会直接报错退出,并提示用hack/install-etcd.sh安装一份副本。
  • 脚本还要求jq在 PATH 中(kube::util::require-jq),用于解析 workspace 模块列表。

如果你没有 etcd,可以在仓库根目录运行:

hack/install-etcd.sh

该脚本会下载 etcd 并解压到仓库的third_party/目录下(hack/install-etcd.sh 注释说明其用途是"convenience to download and install etcd in third_party")。注意它的副作用:会从网络下载二进制包并解压写入third_party/目录。脚本结束时如果当前 PATH 中没有third_party/etcd,会打印一行export PATH=...提示,把该目录加入 PATH 后再运行测试。

hack/lib/etcd.sh 中定义的检查逻辑还会验证:

  • 本机 etcd 版本不低于要求的最低版本(脚本中默认ETCD_VERSION=3.7.1),不足时会尝试使用third_party/etcd中的副本,仍不足则报错etcd version ... or greater required.
  • 默认端口2379必须空闲,否则报unable to start etcd as port 2379 is in use,需要先停掉占用该端口的进程再重试;
  • 在 arm 架构机器上会自动导出ETCD_UNSUPPORTED_ARCH=arm

所有脚本都要从 Kubernetes 仓库根目录运行(见 hack/README.md 中 "all scripts must be run from the Kubernetes root directory")。

完整运行:make test-integration

在仓库根目录直接运行:

make test-integration

该目标定义在 Makefile(即build/root/Makefile的符号链接)中,实际执行:

KUBE_TEST_ARGS='$(value KUBE_TEST_ARGS)' hack/make-rules/test-integration.sh $(WHAT)

KUBE_TEST_ARGS以显式取值方式传递,目的是保留值中的美元符号(例如-run正则中的$$)不被 make 提前展开。

脚本内部按以下顺序工作(见 hack/make-rules/test-integration.sh):

  1. 设置两个环境变量:KUBE_CACHE_MUTATION_DETECTOR=true(默认开启缓存变更检测器,便于发现 cache mutator 问题);KUBE_PANIC_WATCH_DECODE_ERROR=false(集成测试会故意插入无法解码的数据,避免解码错误触发 panic)。
  2. 通过kube::test::find_integration_test_pkgs枚举当前 Go workspace 中所有模块,收集各模块下存在测试文件的test/integration包,作为测试目标列表。
  3. 启动本地 etcd(kube::etcd::start):默认监听127.0.0.1:2379,数据目录使用临时目录,启动后等待/health就绪并做一次写操作确认;同时开始周期性抓取 etcd metrics。
  4. make -C "${KUBE_ROOT}" test运行测试,默认参数--short=true,默认超时KUBE_TIMEOUT=-timeout=600s
  5. 结束后cleanup停止 etcd 进程并删除临时数据目录;trap cleanup EXIT保证中途中断时也会执行清理。

缩小范围:用 WHAT 和 KUBE_TEST_ARGS 只跑部分测试

test-integration目标支持两个参数(Makefile 中的帮助文本):

  • WHAT:要测试的目录名,这些目录下所有*_test.go都会被运行;不指定时运行全部发现的集成测试包。
  • KUBE_TEST_ARGS:透传给底层go test的参数。

Makefile 中给出的两个官方示例:

# 只跑 kubelet 的集成测试并收集覆盖率 make test-integration WHAT=./test/integration/kubelet GOFLAGS="-v -coverpkg=./pkg/kubelet/..." KUBE_COVER="y" # 只跑 pods 目录中指定的单个测试函数 make test-integration WHAT=./test/integration/pods GOFLAGS="-v" KUBE_TEST_ARGS='-run ^TestPodUpdateActiveDeadlineSeconds$$'

第二个示例值得注意:KUBE_TEST_ARGS的值在 shell 层用单引号包裹,其中的$$在 make 展开后变成 go test 正则所需的$锚定符——这正是"显式传$(value KUBE_TEST_ARGS)以保留美元符号"这条注释的用途。想定位某个失败场景时,用这种方式精确过滤到单个测试函数,比全量跑完整个test/integration树快得多。

另外可用KUBE_INTEGRATION_TEST_MAX_CONCURRENCY控制并行度:设为大于 0 的值时,脚本会把GOMAXPROCS设为该值并打印Setting parallelism to ...;默认为-1,不做限制。超时默认 600 秒,可通过KUBE_TIMEOUT覆盖。

如何判断运行成功

  • 正常运行时脚本会依次打印Starting etcd instanceRunning integration test cases等状态日志,测试本身按go test的常规输出展示各包结果;make test的退出码即最终结果——任何一个包失败,整个命令以非零码结束。
  • 测试全部通过后,脚本自动执行Cleaning up etcd并打印Integration test cleanup complete,说明 etcd 进程已被停止、临时数据目录已清理,不会留下残留进程。
  • 如果卡在启动阶段而非测试失败,优先检查两个前置问题:which etcd是否可用,以及 2379 端口是否被占用(hack/lib/etcd.sh 中kube::etcd::validate对这两种情况都会给出对应的明确报错)。

限制说明

  • 该入口面向本地开发环境:它会自行启动、使用并停止一个本地 etcd,只覆盖test/integration目录下的包,不包含 e2e 或 node 测试。
  • etcd 版本低于 3.7.1(hack/lib/etcd.sh中的ETCD_VERSION默认值)时无法运行,需按上文安装或自行提供满足版本要求的 etcd。
  • 由于脚本会在结束后清理 etcd 临时数据,不要把ETCD_DIR指向需要保留数据的目录(hack/lib/etcd.sh 中kube::etcd::clean_etcd_dir会删除ETCD_DIR)。

完成一次全量make test-integration并确认所有包通过后,集成测试层面的验证就告一段落;改动较大或提交 PR 前,仓库惯例是再运行hack/verify-all.sh做整体校验(见 hack/README.md)。

【免费下载链接】kubernetesProduction-Grade Container Scheduling and Management项目地址: https://gitcode.com/GitHub_Trending/kuber/kubernetes

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 19:14:22

二维均匀分布与几何概率:面积比思想与期末解题套路

1. 内容整体设计与思路拆解1.1 期末备考的痛点:为什么二维均匀分布总丢分概率论与数理统计的期末考试里,二维随机变量这一章向来是“重灾区”。很多人学完一整轮,求分布函数会套公式,求边缘密度会积分,但一碰上二维均匀…

作者头像 李华
网站建设 2026/9/9 19:13:25

基于αβ变换的两级VSC功率控制Simulink仿真实践

最近在搭一套两级电压源变流器的功率控制仿真,核心就是做实时无功-有功控制器,电流反馈环节用了αβ静止坐标系变换。这套拓扑在光伏并网、储能变流器、有源滤波器里都非常常见,控制思路也基本可以通用到三相整流、PWM逆变这些场合。Simulink…

作者头像 李华
网站建设 2026/9/9 19:12:39

ASMedia USB控制器固件救砖指南:ASMTool转储与刷写实战

简介:面向ASMedia PCI USB控制器固件研究与故障排查的开发工具源码,专为遭遇USB 3.1大容量传输锁定或无法直接转储当前固件的用户设计。项目基于C#语言编写,核心功能涵盖PCI设备探测、内存与寄存器读写、地址映射以及固件转储,适用…

作者头像 李华
网站建设 2026/9/9 19:12:19

氢储能+热电联供:微电网优化调度方法全解析

1. 为什么是氢储能热电联供:这套系统到底在解决什么问题 做微电网的同行应该都有体会,单纯的电储能越用越觉得“不够用”。锂电池适合做小时级的能量搬移,但要跨天、跨周,甚至考虑北方园区冬季那种连续几天的供热需求,…

作者头像 李华
网站建设 2026/9/9 19:09:32

SpringBoot+Vue乡镇农产品宣传与商城一体化系统实战解析

乡镇农产品电商这两年被提得很多,但真正落到乡镇实地,会发现需求和城市电商完全不同。农产品不是标准品,宣传和销售必须绑定在一起——光有商城没有产地故事,用户不信任;光有宣传页没有下单入口,流量就白费…

作者头像 李华