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):
- 设置两个环境变量:
KUBE_CACHE_MUTATION_DETECTOR=true(默认开启缓存变更检测器,便于发现 cache mutator 问题);KUBE_PANIC_WATCH_DECODE_ERROR=false(集成测试会故意插入无法解码的数据,避免解码错误触发 panic)。 - 通过
kube::test::find_integration_test_pkgs枚举当前 Go workspace 中所有模块,收集各模块下存在测试文件的test/integration包,作为测试目标列表。 - 启动本地 etcd(
kube::etcd::start):默认监听127.0.0.1:2379,数据目录使用临时目录,启动后等待/health就绪并做一次写操作确认;同时开始周期性抓取 etcd metrics。 - 以
make -C "${KUBE_ROOT}" test运行测试,默认参数--short=true,默认超时KUBE_TIMEOUT=-timeout=600s。 - 结束后
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 instance、Running 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),仅供参考