偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇帶你kubebuilder 進(jìn)階: 測(cè)試

開(kāi)發(fā) 項(xiàng)目管理
今天我們大概看一下單元測(cè)試和集成測(cè)試怎么做。單元測(cè)試和 golang 的單元測(cè)試沒(méi)有什么太大的區(qū)別,一般可以通過(guò)單元測(cè)試搞定的首先使用單元測(cè)試,因?yàn)閱卧獪y(cè)試寫起來(lái)最容易。

[[399666]]

Operator 的測(cè)試是一個(gè)比較頭疼的問(wèn)題,在 kubernetes 資源是在不斷變化的,并且想要在測(cè)試的時(shí)候跑一整套的 kubernetes 環(huán)境也不是一件容易的事情,今天我們大概看一下單元測(cè)試和集成測(cè)試怎么做。

單元測(cè)試

單元測(cè)試和 golang 的單元測(cè)試沒(méi)有什么太大的區(qū)別,一般可以通過(guò)單元測(cè)試搞定的首先使用單元測(cè)試,因?yàn)閱卧獪y(cè)試寫起來(lái)最容易,例如下面這一段對(duì)節(jié)點(diǎn)標(biāo)簽更新邏輯進(jìn)行測(cè)試

  1. func TestNodePoolSpec_ApplyNode(t *testing.T) { 
  2.  type fields struct { 
  3.   Taints  []corev1.Taint 
  4.   Labels  map[string]string 
  5.   Handler string 
  6.  } 
  7.  type args struct { 
  8.   node v1.Node 
  9.  } 
  10.  tests := []struct { 
  11.   name   string 
  12.   fields fields 
  13.   args   args 
  14.   want   *corev1.Node 
  15.  }{ 
  16.   { 
  17.    name"label"
  18.    fields: fields{ 
  19.     Labels: map[string]string{ 
  20.      "node-pool.lailin.xyz/test"""
  21.     }, 
  22.    }, 
  23.    args: args{ 
  24.     node: v1.Node{ 
  25.      ObjectMeta: metav1.ObjectMeta{ 
  26.       Name"worker"
  27.       Labels: map[string]string{ 
  28.        "kubernetes.io/arch""amd64"
  29.        "a":                  "b"
  30.       }, 
  31.      }, 
  32.     }, 
  33.    }, 
  34.    want: &v1.Node{ 
  35.     ObjectMeta: metav1.ObjectMeta{ 
  36.      Name"worker"
  37.      Labels: map[string]string{ 
  38.       "kubernetes.io/arch":        "amd64"
  39.       "node-pool.lailin.xyz/test"""
  40.      }, 
  41.     }, 
  42.    }, 
  43.   }, 
  44.  } 
  45.  for _, tt := range tests { 
  46.   t.Run(tt.name, func(t *testing.T) { 
  47.    s := &NodePoolSpec{ 
  48.     Taints:  tt.fields.Taints, 
  49.     Labels:  tt.fields.Labels, 
  50.     Handler: tt.fields.Handler, 
  51.    } 
  52.    assert.Equal(t, tt.want, s.ApplyNode(tt.args.node)) 
  53.   }) 
  54.  } 

集成測(cè)試

controller-runtime 提供 envtest ,這個(gè)包可以幫助你為你在 etcd 和 Kubernetes API server 中設(shè)置并啟動(dòng)的 controllers 實(shí)例來(lái)寫集成測(cè)試,不需要 kubelet,controller-manager 或者其他組件。

envtest

一個(gè) envtest 的簡(jiǎn)單例子如下

  1. import sigs.k8s.io/controller-runtime/pkg/envtest 
  2.  
  3. //指定 testEnv 配置 
  4. testEnv = &envtest.Environment{ 
  5.     CRDDirectoryPaths: []string{filepath.Join("..""config""crd""bases")}, 
  6.  
  7. //啟動(dòng) testEnv 
  8. cfg, err = testEnv.Start() 
  9.  
  10. //編寫測(cè)試邏輯 
  11.  
  12. //停止 testEnv 
  13. err = testEnv.Stop() 

envtest 在啟動(dòng)的時(shí)候需要設(shè)置一些環(huán)境變量來(lái)說(shuō)明我們使用什么控制平面來(lái)進(jìn)行測(cè)試

  • USE_EXISTING_CLUSTER表示使用一個(gè)已經(jīng)存在的控制平面
  • KUBEBUILDER_ASSETS 本地控制平面二進(jìn)制文件的文件夾路徑,里面包含了 kubectl apiserver和 etcd
  • KUBEBUILDER_CONTROLPLANE_START_TIMEOUT控制平面啟動(dòng)的超時(shí)時(shí)間
  • KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT控制平面停止的超時(shí)時(shí)間

編寫測(cè)試

kubebuilder 在生成代碼的時(shí)候已經(jīng)幫我們生成好了相關(guān)的腳手架,已經(jīng)環(huán)境配置,我們只需要寫具體的測(cè)試邏輯就行了

下面我們就以創(chuàng)建一個(gè) NodePool 為例子看看集成測(cè)試怎么寫

  1. controllers/suite_test.go 

  1. var _ = Describe("node labels", func() { 
  2.  pool := &nodesv1.NodePool{ 
  3.   ObjectMeta: metav1.ObjectMeta{ 
  4.    Name"test"
  5.   }, 
  6.   Spec: nodesv1.NodePoolSpec{ 
  7.    Labels: map[string]string{ 
  8.     "node-pool.lailin.xyz/xxx"""
  9.    }, 
  10.    Handler: ""
  11.   }, 
  12.  } 
  13.  
  14.  It("create pool", func() { 
  15.   ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second
  16.   defer cancel() 
  17.   err := k8sClient.Create(ctx, pool) 
  18.   Expect(err).NotTo(HaveOccurred()) 
  19.  }) 
  20. }) 

使用 make test 執(zhí)行測(cè)試

  1. Using cached envtest tools from blog-code/k8s-operator/07-node-pool-operator/testbin 
  2. setting up env vars 
  3. ?       github.com/mohuishou/blog-code/k8s-operator/node-pool-operator  [no test files] 
  4. ok      github.com/mohuishou/blog-code/k8s-operator/node-pool-operator/api/v1   9.403s  coverage: 24.5% of statements 
  5. ok      github.com/mohuishou/blog-code/k8s-operator/node-pool-operator/controllers      10.390s coverage: 0.0% of statements 

總結(jié)

今天這篇文章主要還是希望起一個(gè)拋磚引玉的作用,沒(méi)有過(guò)多的去深入具體改如何寫單元測(cè)試和集成測(cè)試,只是給了兩個(gè)例子,關(guān)于集成測(cè)試如果感興趣可以看看 https://onsi.github.io/ginkgo 和 envtest 的相關(guān)文檔。

對(duì)于 Operator 來(lái)說(shuō)建議能寫單元測(cè)試的還是寫單元測(cè)試,能夠本地寫集成測(cè)試的就寫集成測(cè)試這樣我們?cè)趯?shí)際上線的時(shí)候就會(huì)減少 bug 的概率,因?yàn)橄鄬?duì)于業(yè)務(wù)代碼來(lái)說(shuō) Operator 的測(cè)試實(shí)在是比較麻煩,對(duì)于測(cè)試同學(xué)的要求也比較高,一不小心就有可能遺漏一些問(wèn)題。

 

責(zé)任編輯:姜華 來(lái)源: mohuishou
相關(guān)推薦

2021-05-18 05:40:27

kubebuilderwebhook進(jìn)階

2021-05-12 06:18:19

KubeBuilderOperatork8s

2021-05-16 10:52:58

kubebuilderstatus event

2021-05-08 09:02:48

KubeBuilderOperatork8s

2021-01-01 09:20:20

操作DjangoORM

2023-04-20 08:00:00

ES搜索引擎MySQL

2021-05-20 06:57:16

RabbitMQ開(kāi)源消息

2021-07-26 09:31:09

自動(dòng)化測(cè)試編程語(yǔ)言手機(jī)編程

2022-03-10 08:31:51

REST接口規(guī)范設(shè)計(jì)Restful架構(gòu)

2025-01-17 07:00:00

2022-02-24 07:56:42

開(kāi)發(fā)Viteesbuild

2021-06-16 08:28:25

unary 方法函數(shù)技術(shù)

2021-10-27 09:59:35

存儲(chǔ)

2020-11-27 08:02:41

Promise

2023-02-28 23:04:15

2021-11-24 08:51:32

Node.js監(jiān)聽(tīng)函數(shù)

2021-11-16 14:09:58

Containerd Dockerk8s

2021-11-08 08:42:44

CentOS Supervisor運(yùn)維

2023-04-21 08:11:54

KubernetesPod

2021-12-15 11:52:34

GPLLinuxGNU
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)