更易用的K8S End-to-End 测试
英文版原文,时间2019年三月
K8S越来越多元件独立于K8S本身独立开发。
如存储驱动,早先被编译进K8S的binary,后来演变成独立binary,再到以Container Storage Interface(CSI)以POD形式部署在K8S本身。
如何对外部元件,如Intel的Open Infrastructure Manager(OIM)和PMEM-CSI做end to end测试,是个挑战。对K8S本身测试的E2E framework可以直接使用,但因涉及外部依赖多,处理起来麻烦。本篇文章概述了K8S1.13的优化。
End to End 测试包含了下面多个步骤:
- 实现一组test suite。这也是本篇的重点,K8S E2E框架是由Go写成的,使用Ginkgo做用例管理、Gomega做断言。这些工具支持Behavior Driven Development(BDD)模式,用例透过client-go和K8S交互。
- 启动一个K8S测试集群。可用kubetest工具。
- 在K8S测试集群执行End to End test suite。测试工具透过环境变量KUBECONFIG指向的文件链接K8S(如kubectl)。
下面列出目前优化的一些方向:
分离provider
E2E framework在1.12版本以下没有和provider SDKs做解耦,而这些只在特定测试中被使用。现在移到可选的test packages(test/e2e/framework/providers)目录底下。E2E framework透过接口调用,然后由各vendor package实现。
E2E test suite决定哪些test packages被import,vendor package透过–provider命令行flag启动生效。
外部文件
测试可能在runtime需要读额外的文件,如.yaml manifests,一般为了简化搬运和执行的过程,透过go-bindata将test/e2e/testing-manifests目录下的文件链接到K8S e2e.test binary。现在是bindata支持是可选的,目录可配置且限制更少。
测试参数
v1.12 将测试参数处理集中在test/e2e/framework/test_context.go 透过flags处理,但对独立framework的tests需要其他方法。目前做法是透过特殊的package去定义自己参数。参数透过下面方式被处理:
- test packages的init代码定义了tests和参数。tests定义不能使用这些参数,因为参数还没有实际的值。
- test suite的init代码解析了参数和配置文件。
- tests执行时可以使用参数。
另外,目前也支持透过动态获取配置文件(Viper)的方式。目前这个方法有些弊端,正持续优化。
.yaml manifests支持多个items
E2E framework新方法已经支持了.yaml manifests有多个items,且做一些patch(例如每一个test可以有独立的namespace)。目前这个功能也被用在CSI drivers的测试,每一次测试都会产出多个items,包含重新部署CSI drivers。
当然更好的做法是部署一次CSI drivers,然后tests共同使用。这部分仰赖测试环境工具拓展支持CSI drivers部署的功能。
K8S 1.14将带来的改进
- E2E framework已有的storage tests可被其他CSI drivers test suite复用。
- 跳过unsupported测试定义已经被丢弃。
- 易读的测试定义。
- 测试外部drivers还有些优化。
E2E test suite HOWTO
Test suite初始化:
重点看e2e_test.go 和 e2e.go。
e2e_test.go包含import 多种providers, in-tree tests,Viper配置支持,和bindata文件查找。
e2e.go控制实际的执行,包含集群准备和metrics收集。
新增E2E storage tests:
test suites importtest packages定义了E2E测试。E2E测试比较特别的是会用framework.NewDefaultFramework方法实例化framework.Framework指针(常用f)。这个变量会在每个test的BeforeEach重新初始化,然后在AfterEach释放。测试时可在runtime使用f.ClientSet和f.Namespace。
Vendors:
略
编译和执行test suite:
go test ./test/e2e -args -help -> help查看说明
go test -timeout=0 -v ./test/e2e -ginkgo.v -> 跑所有测试
ginkgo -p ./test/e2e -> 并发跑测试