OpenShift Extended 测试实战:在 origin 仓库中编写、运行与结构化组织扩展测试
测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载在 originOpenShift 的 Conformance 测试套件仓库中test/extended/目录承载着一套基于 Ginkgo/Gomega 的功能级扩展测试extended tests。这些测试通过程序化调用ocCLI 和 Kubernetes/OpenShift 客户端来验证构建、镜像、OAuth、路由等核心功能。读完本文你将掌握 extended 测试的运行方式、测试标签规范、目录组织结构、独立测试组启动器的创建方法以及如何用exutil.CLI在 Ginkgo 用例中精确模拟oc命令并断言结果。一、前置条件按照 test/extended/README.md 的说明开发 extended 测试前需要满足两个前提在仓库中同时编译oc与openshift-tests两个命令行工具$ make WHATcmd/openshift-tests设置环境变量KUBECONFIG使其指向你要测试的目标集群$ export KUBECONFIG/path/to/kubeconfigopenshift-tests的入口源码位于 cmd/openshift-tests/openshift-tests.go其子命令实现分散在pkg/cmd/openshift-tests/下例如run、list、monitor、disruption等目录覆盖了运行测试、列出套件、监控测试、扰动测试等场景。二、运行 Extended 测试按全名运行单个测试$ openshift-tests run-test FULL_TEST_NAME查看可用套件列表$ openshift-tests help run具体的测试前置依赖prerequisites会写在各测试的描述文字中运行前先阅读被测用例的 Description。用正则过滤子集运行官方推荐的做法是先把全量测试列表以 dry-run 方式打印出来再用grep -E过滤后通过-f -从标准输入喂给运行器$ openshift-tests run all --dry-run | grep -E REGEX | openshift-tests run -f -这种方式适合在本地只跑与某功能相关的测试子集而不改动 CI 配置。三、测试标签Test Labels规范extended 测试的标签体系与 Kubernetes e2e 测试的标签约定一致README 中引用了 k8s 社区的 e2e-tests 标签说明文档。核心规则如下标签含义与使用条件无标签测试应快速完成5 分钟内、可并行运行且结果一致[Serial]不能与其他测试并行例如占用大量资源或重启节点必须作为独立套件串行运行[Slow]单独或并行运行超过 5 分钟。把慢测试分到独立分区可以让绝大多数测试快速并行跑完。特别注意凡是涉及构建builds的 OpenShift extended 测试都应标记[Slow][Conformance]覆盖集群核心关键功能且不与其它 conformance 测试重复覆盖的用例才算有效。README 给出的正例是“构建能否工作Do builds work”反例是“设置 forcePull 标志后构建能否工作”——后者属于特殊配置不属于 conformance[local]需要访问测试机本地资源例如使用 docker socket的测试原则上 extended 测试应避免访问本地宿主无法避免时才打此标签四、Extended 测试的目录结构扩展测试统一位于 test/extended/ 目录其组织结构为test/extended/util提供 extended 测试共用的辅助函数与工具。它封装了对 OpenShift CLI 的易用接口前文提到的exutil同时提供对 Kubernetes E2E framework 的访问以及跨多个测试用例共享的 OpenShift 辅助逻辑让测试用例保持 DRY。其核心文件 test/extended/util/client.go 定义了CLI类型。test/extended/testdata存放 extended 测试用到的 JSON/YAML 等 fixture 文件当前约 400 个 manifest 文件。test/extended/[images,builds,...]每个 Go 包包含一组相关联的 extended 测试。例如images目录存放验证容器镜像使用场景的用例builds存放构建相关用例。从当前仓库实际目录看除了util与testdata还有apiserver、authentication、authorization、builds、etcd、networking、oauth、operators、router、storage等数十个功能包每个包对应一类被测功能域。五、包Package与测试组Group的区别README 给出的组织原则是每一类功能测试都应当放在自己的 Go 包里但如果你的测试包需要以不同于标准路径的方式专门配置服务端则要在test/extended目录下创建一个与包同名的 launcher 脚本shell 启动器。典型的例子是 LDAP 认证测试你需要先把 OpenShift server 配置成启用 LDAP 认证才能测认证流程。做法是新建测试组ldap并提供 shell 启动器./test/extended/ldap.sh用于以所需配置启动 OpenShift把测试源码放到对应功能包的 Go 目录下例如./test/extended/ldap在顶层 suite 上给你的用例加组前缀var _ g.Describe([ldap] Authenticate using LDAP, func() { # ... })创建新的测试组 Runner如果你的测试需要与其它 extended 用例不同的配置应在test/extended下新建执行脚本并注意用 Ginkgo 的 focus 机制只选中你自己的测试。如果你的测试无法作为默认组的一部分运行务必确保该包不被test/extended的默认入口包含。当前仓库中仍保留了这种 shell runner 的范例——test/extended/cmd.sh。它演示了一个完整的组 runner 生命周期source $(dirname ${BASH_SOURCE})/../../hack/lib/init.sh os::util::environment::setup_time_vars os::build::setup_env # 以默认配置启动 OpenShift server无 registry/router os::util::environment::use_sudo os::cleanup::tmpdir os::util::environment::setup_all_server_vars os::start::configure_server os::start::server export KUBECONFIG${ADMIN_KUBECONFIG} # 注册 junit suite 并执行 oc 命令断言 os::test::junit::declare_suite_start extended/cmd/new-app os::cmd::expect_success oc new-app test/scratchimage~https://github.com/openshift/ruby-hello-world.git --strategydocker ... os::test::junit::declare_suite_end可以看到 launcher 脚本负责环境准备setup_env、use_sudo、服务端配置与启动configure_server、server并用os::test::junit::declare_suite_start/end向 JUnit 报告注册测试套件测试断言则大量使用os::cmd::expect_success_and_text、os::cmd::try_until_text等对oc命令输出做正则验证的封装。Bash 辅助函数README 指出 extended 测试的通用函数位于./hack/util.sh环境设置脚本位于 hack/lib/util/environment.sh主要函数包括函数作用ginkgo_check_extended()检查 Ginkgo 二进制是否已安装compile_extended()将 Go 测试编译为测试二进制test_privileges()校验是否有权限启动 OpenShift serveros::util::environment::setup_all_server_vars()设置 OpenShift server 所需的全部环境变量os::start::configure_server()生成 OpenShift server 的所有配置文件os::start::server()启动 OpenShift master 与 nodeos::start::router()安装 OpenShift 路由服务os::start::registry()安装 OpenShift 容器镜像 registry 服务create_image_streams_extended()为所有 OpenShift 镜像创建 ImageStream从源码结构看os::util::environment::setup_all_server_vars的实际定义在 hack/lib/util/environment.shos::start::configure_server与os::start::server定义在 hack/lib/start.sh——configure_server会生成 master 证书、node 配置与 OpenShift 配置server则启动服务并等待端点可用。编写 launcher 时直接source这些库即可复用整套启动流程。六、CLI 接口在测试中模拟 oc 命令extended 测试的核心能力是通过exutil.CLI包路径 test/extended/util/client.go调用 OpenShift CLI 与 Kubernetes/OpenShift 客户端从而在 Ginkgo 用例中模拟oc命令。顶层 Describe 中创建 CLI 实例要在测试套件中模拟oc命令必须先创建 CLI 实例且应放在顶层 GinkgoDescribe容器中。顶层 Describe 的标签需要同时给出测试所属的 bucket 与简短描述其它全局可访问变量如 fixtures也在此声明package extended import ( g github.com/onsi/ginkgo/v2 o github.com/onsi/gomega ) var _ g.Describe([test bucket] Testing scenario, func() { defer g.GinkgoRecover() var ( oc exutil.NewCLI(test-name) testFixture filepath.Join(testdata, test.json) ) })测试套件应进一步组织为更下层的Describe容器用消息描述测试目标每个下层容器内用单个It承载具体 specIt共享上下文并说明如何达成测试目标var _ g.Describe([default] STI build, func() { defer GinkgoRecover() var ( stiBuildFixture filepath.Join(testdata, test-build.yaml) oc exutil.NewCLI(build-sti, kubeConfigPath()) ) g.Describe(Building from a template, func() { g.It(fmt.Sprintf(should create a image from %q template, filepath.Base(stiBuildFixture)), func() { ... } } }源码层面NewCLI() 会基于给定的 namespace 名称初始化 CLI 及 Kube framework 辅助结构并注册g.BeforeEach(cli.SetupProject)在每条用例前创建项目、g.AfterEach(cli.TeardownProject)在用例后回收项目因此测试用例无需自行管理项目生命周期。从 NewCLIWithoutNamespace() 的实现看底层framework.Framework默认使用ClientQPS: 20、ClientBurst: 50的客户端限流参数execPath固定为ockubeconfig 路径取自KubeConfigPath()——这与前置条件中要求设置KUBECONFIG环境变量相呼应。命令动词与参数Run / Args / Template模拟oc命令时先用Run()指定命令动词get、create、start-build等再用Args()追加参数方法可以自由链式调用oc oc.Run(create)oc oc.Run(create).Args(-f, testFixture)Template()方法可给 CLI 命令附加 Go 模板参数但前提是Run()中指定了get动词oc oc.Run(get).Args(foo).Template({{ .spec }})它等价于命令行执行$ oc get foo -o template --template{{ .spec }}执行与断言Execute / Output / By / Expect执行命令有两种方式Execute()执行命令并返回过程中发生的错误Output()除返回错误外还返回命令输出err : oc.Run(create).Args(-f, testFixture).Execute()buildName, err : oc.Run(start-build).Args(test).Output()用 Ginkgo 的By函数打印下一组命令的意图使测试日志可读g.By(starting a test build) buildName, err : oc.Run(start-build).Args(test).Output()用 Gomega 的Expect语法对错误做断言err oc.Run(create).Args(-f, stiEnvBuildFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred())CLI类型本身的字段设计也印证了这一接口语义从 client.go 中的结构体定义看CLI分别维护verb命令动词、globalArgs、commandArgs、finalArgs最终拼接参数、stdin/stdout/stderr进程标准流以及adminConfigPathkubeconfig等字段Run()/Args()只是往这些字段累积状态真正的进程执行发生在Execute()/Output()调用时源码中对应Run于 L984、Args于 L1032、Output于 L1048、Execute于 L1158 的实现。此外CLI还提供了KubeFramework()访问 Kubernetes framework 助手、SetupProject()/TeardownProject()管理项目以及NewCLIWithFramework()、NewHypershiftManagementCLI()等针对不同场景绑定已有 framework、Hypershift 管理集群的构造方式编写特殊场景测试时可按需选用。七、小结一个新 Extended 测试的完整流程综合以上内容向 origin 仓库提交一个新 extended 测试的标准路径是确认测试归属的功能域将用例放入对应的 Go 包如test/extended/builds/fixture 放入 test/extended/testdata若需要特殊服务端配置在test/extended/下新增同名 launcher 脚本复用hack/lib中的环境与服务启动函数并用 Ginkgo focus 圈定本组用例在顶层Describe中声明 bucket 前缀并创建exutil.NewCLI实例按Run/Args/Template构造命令用Execute/Output执行、o.Expect断言按标签规范决定是否加[Serial]、[Slow]、[Conformance]、[local]标签避免慢测试拖慢并行分区本地用openshift-tests run-test FULL_TEST_NAME或正则过滤子集验证通过后再提交。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐OrcaSlicer 测试套件实战指南Catch2 测试的组织、编写与构建运行全解析OrcaSlicer 测试套件实战指南Catch2 测试的组织、编写与构建运行全解析 本篇技术指南以 OrcaSlicer 仓库 tests/ 目录下的测试工桌面应用3D渲染图形学Quick 测试组织指南用 Example 与 Example Group 编写结构化测试Quick 测试组织指南用 Example 与 Example Group 编写结构化测试 本文是 QuickSwift / Objective C 行为驱测试开发工具Johnny-Five 扩展测试Extended Tests机制解析时间敏感测试的隔离、编写与运行Johnny Five 扩展测试Extended Tests机制解析时间敏感测试的隔离、编写与运行 导读 Johnny Five 是面向 ArduinoIoT机器人嵌入式上一篇Wayback Machine 扩展上手指南3 步装好找回消失的网页下一篇open-vela packages 快应用示例源码导读Chart图表与Player播放器完整拆解指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CiLocks ngrok隧道详解:如何把本地PHP服务秒变公网可访问的完整指南

CiLocks ngrok隧道详解:如何把本地PHP服务秒变公网可访问的完整指南

CiLocks ngrok隧道详解:如何把本地PHP服务秒变公网可访问的完整指南 【免费下载链接】CiLocks Crack Interface lockscreen, Metasploit and More Android/IOS Hacking 项目地址: https://gitcode.com/GitHub_Trending/ci/CiLocks CiLocks 是一款面向 Androi…

2026/9/25 16:14:57 阅读更多 →
VoltAgent User Analytics:按用户分组 Trace、按会话聚合并联动反馈信号的排查方法

VoltAgent User Analytics:按用户分组 Trace、按会话聚合并联动反馈信号的排查方法

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 在…

2026/9/25 16:14:57 阅读更多 →
RAG系统学习

RAG系统学习

参考:1.从零拆解一个 RAG 系统:纯 API 调用、无需 GPU|基于 LangChain Chroma DeepSeek 的学习笔记_通过api调用rag-CSDN博客 一、RAG 到底在解决什么问题? 大模型有两个硬伤: 训练数据有截止日期,不知…

2026/9/25 16:14:57 阅读更多 →

最新新闻

基于SpringBoot的个人健康与运动习惯追踪系统设计与实现

基于SpringBoot的个人健康与运动习惯追踪系统设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着生活节奏的加快和工作压力的增大,久坐、缺乏运动、作息不规律等不良生活习惯日益普遍,亚健康状态成为现代人面临的突出问…

2026/9/25 16:53:19 阅读更多 →
用 Dify 打造数据可视化图表:从数据接入到图表输出的完整配置指南

用 Dify 打造数据可视化图表:从数据接入到图表输出的完整配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 16:53:18 阅读更多 →
为什么 4 卡生成快了近 5 倍?MiniMax-H3-Comfy-NPU 多 NPU 并行 1/2/4 卡配置全解

为什么 4 卡生成快了近 5 倍?MiniMax-H3-Comfy-NPU 多 NPU 并行 1/2/4 卡配置全解

为什么 4 卡生成快了近 5 倍?MiniMax-H3-Comfy-NPU 多 NPU 并行 1/2/4 卡配置全解 【免费下载链接】MiniMax-H3-Comfy-NPU 项目地址: https://ai.gitcode.com/Ascend-SACT/MiniMax-H3-Comfy-NPU MiniMax-H3-Comfy-NPU 是一个让 MiniMax-H3 视频音频联合生成…

2026/9/25 16:53:18 阅读更多 →
Scoop:Windows软件包管理神器

Scoop:Windows软件包管理神器

文章目录scoopBucketscoop scoop是Windows上的命令行安装器,和Windows自带的Winget相比,Scoop奉行绿色便携的哲学,它下载的大多是压缩包,解压到用户目录(~\scoop\apps)即用。不写注册表,不往系统盘塞垃圾。卸载时直接…

2026/9/25 16:53:18 阅读更多 →
easyocr:基于Pytorch的光学字符识别神器

easyocr:基于Pytorch的光学字符识别神器

文章目录安装并下载模型试用类和方法安装并下载模型 easyocr是基于PyTorch的光学字符识别(Optical Character Recongnition, OCR)工具,开箱即用,支持从自然场景图像到密集文档的文本提取。在确认安装Pytorch之后,用pip安装即可。 pip insta…

2026/9/25 16:53:18 阅读更多 →
MES生产执行系统全流程:工厂车间到底怎么实现数字化管理

MES生产执行系统全流程:工厂车间到底怎么实现数字化管理

1. 为什么工厂车间需要 MES很多工厂已经上了 ERP,计划部门能在系统里排单、算物料、看库存,但计划一旦下达到车间,后面的事情往往就变成“拍脑袋”和“靠人追”。今天生产了多少、哪台设备在停机、这批料是谁领的、质量异常卡在哪个工序&…

2026/9/25 16:52:18 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →