Kubernetes End-to-End Testing for Everyone中文摘要

更易用的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 测试包含了下面多个步骤:

  1. 实现一组test suite。这也是本篇的重点,K8S E2E框架是由Go写成的,使用Ginkgo做用例管理、Gomega做断言。这些工具支持Behavior Driven Development(BDD)模式,用例透过client-go和K8S交互。
  2. 启动一个K8S测试集群。可用kubetest工具。
  3. 在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 -> 并发跑测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值