编写 E2E 测试
可以参考 Kubebuilder/v4/test/e2e/utils 包,其中提供了功能丰富的 TestContext:
- NewTestContext 用于定义:
- 临时项目目录;
- 临时 controller-manager 镜像;
- Kubectl 执行方法;
- CLI 可执行文件(
kubebuilder、operator-sdk或你扩展的 CLI)。
定义完成后,即可使用 TestContext:
-
搭建测试环境:
- 清理环境并创建临时目录,见 Prepare;
- 安装前置 CRD,见 InstallCertManager、InstallPrometheusManager。
-
校验插件行为:
- 触发插件绑定的子命令,见 Init、CreateAPI;
- 使用 PluginUtil 校验脚手架输出,见 InsertCode、ReplaceInFile、UncommentCode。
-
验证脚手架工程可工作:
- 执行
Makefile中的目标,见 Make; - 临时加载被测控制器镜像到 Kind,见 LoadImageToKindCluster;
- 使用 Kubectl 验证运行中的资源,见 Kubectl。
- 执行
-
清理测试资源:
- 卸载前置 CRD,见 UninstallPrometheusOperManager;
- 删除临时目录,见 Destroy。
参考:
生成测试样例
查看由你的插件生成的样例项目内容非常直接。
例如 Kubebuilder 基于不同插件生成样例项目以验证布局。
你也可以用 TestContext 生成由插件脚手架的项目目录结构。用到的命令与扩展 CLI 能力与插件中类似。
以下演示使用 go/v4 插件创建样例项目的一般流程(其中 kbc 是 TestContext 实例):
-
初始化一个项目:
By("initializing a project") err = kbc.Init( "--plugins", "go/v4", "--project-version", "3", "--domain", kbc.Domain, "--fetch-deps=false", ) Expect(err).NotTo(HaveOccurred(), "Failed to initialize a project") -
定义 API:
By("creating API definition") err = kbc.CreateAPI( "--group", kbc.Group, "--version", kbc.Version, "--kind", kbc.Kind, "--namespaced", "--resource", "--controller", "--make=false", ) Expect(err).NotTo(HaveOccurred(), "Failed to create an API") -
脚手架生成 webhook 配置:
By("scaffolding mutating and validating webhooks") err = kbc.CreateWebhook( "--group", kbc.Group, "--version", kbc.Version, "--kind", kbc.Kind, "--defaulting", "--programmatic-validation", ) Expect(err).NotTo(HaveOccurred(), "Failed to create an webhook")
