Operator很头疼。kubernetes里面的资源是不断变化的,测试的时候跑一整套kubernetes环境也不是一件容易的事。事情,今天我们就大致看一下如何做单元测试和集成测试。单元测试单元测试和golang单元测试没有太大区别。一般可以先做单元测试,因为单元测试最容易写。例如以下部分测试节点标签更新逻辑.Node}{{name:"label",fields:fields{Labels:map[string]string{"node-pool.lailin.xyz/test":"",},},args:args{node:v1.Node{ObjectMeta:metav1.ObjectMeta{Name:"worker",Labels:map[string]string{"kubernetes.io/arch":"amd64","a":"b",},},},},want:&v1.Node{ObjectMeta:metav1.ObjectMeta{Name:"worker",Labels:map[string]string{"kubernetes.io/arch":"amd64","node-pool.lailin.xyz/test":"",},},},},}for_,tt:=rangetests{t.Run(tt.name,func(t*testing.T){s:=&NodePoolSpec{Taints:tt.fields.Taints,Labels:tt.fields.Labels,处理程序:tt.fields.Handler,}断言.Equal(t,tt.want,s.ApplyNode(tt.args.node))})}}集成测试controller-runtime提供了envtest,这个包可以帮助你在etcd和KubernetesAPIservercontrollers实例中设置和启动编写集成测试,不需要kubelet、controller-manager或其他组件envtestenvtest的简单例子如下importsigs.k8s.io/controller-runtime/pkg/envtest//指定testEnv配置testEnv=&envtest.Environment{CRDDirectoryPaths:[]string{filepath.Join("..","config","crd","bases")},}//启动testEnvcf??g,err=testEnv.Start()//编写测试逻辑//停止testEnverr=testEnv.Stop()envtest需要设置一些环境变量来说明什么时候我们使用什么控制平面进行测试?USE_EXISTING_CLUSTER表示使用已有的控制平面KUBEBUILDER_ASSETS本地控制平面二进制文件的文件夹路径,包含kubectlapiserver和etcdKUBEBUILDER_CONTROLPLANE_START_TIMEOUT控制平面启动超时时间KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT控制平面停止写入超时时间测试kubebuilder时已经为我们生成了相关脚手架生成代码,环境已经配置完成。我们只需要编写具体的测试逻辑即可。下面以创建NodePool为例,看看如何编写controllers/suite_test来进行集成测试。govar_=Describe("nodelabels",func(){pool:=&nodesv1.NodePool{ObjectMeta:metav1.ObjectMeta{Name:"test",},Spec:nodesv1.NodePoolSpec{Labels:map[string]string{"node-pool.lailin.xyz/xxx":"",},Handler:"",},}It("createpool",func(){ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)defercancel()err:=k8sClient.Create(ctx,pool)Expect(err).NotTo(HaveOccurred())})})使用maketest执行测试Usingcachedenvtesttoolsfromblog-code/k8s-operator/07-node-pool-operator/testbinsettingupenvvars?github.com/mohuishou/blog-code/k8s-operator/node-pool-operator[notestfiles]好的github。com/mohuishou/blog-code/k8s-operator/node-pool-operator/api/v19.403scoverage:24.5%ofstatementsokgithub.com/mohuishou/blog-code/k8s-operator/node-pool-operator/controllers10.390scoverage:0.0%ofstatements总结今天的文章主要是希望起到一个引流的作用。我没有详细介绍如何编写单元测试和集成测试。我只是举了两个例子。对集成测试感兴趣的可以看看https://onsi.github.io/ginkgo和envtest相关文档对于Operators,建议写单元测试或者写单元测试,如果你写集成测试可以在本地写集成测试,这样我们真正上线的时候会减少出现bug的概率,因为相对于业务代码,Operator测试确实比较麻烦,对测试同学的要求也比较高,有些问题如果您不小心,可能会错过。
