日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一篇帶你kubebuilder進階:測試

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

創(chuàng)新互聯(lián)建站是專業(yè)的哈密網(wǎng)站建設公司,哈密接單;提供成都網(wǎng)站制作、網(wǎng)站設計,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行哈密網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

單元測試

單元測試和 golang 的單元測試沒有什么太大的區(qū)別,一般可以通過單元測試搞定的首先使用單元測試,因為單元測試寫起來最容易,例如下面這一段對節(jié)點標簽更新邏輯進行測試

 
 
 
 
  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.  } 

集成測試

controller-runtime 提供 envtest ,這個包可以幫助你為你在 etcd 和 Kubernetes API server 中設置并啟動的 controllers 實例來寫集成測試,不需要 kubelet,controller-manager 或者其他組件。

envtest

一個 envtest 的簡單例子如下

 
 
 
 
  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. //啟動 testEnv 
  8. cfg, err = testEnv.Start() 
  9.  
  10. //編寫測試邏輯 
  11.  
  12. //停止 testEnv 
  13. err = testEnv.Stop() 

envtest 在啟動的時候需要設置一些環(huán)境變量來說明我們使用什么控制平面來進行測試

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

編寫測試

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

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

 
 
 
 
  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í)行測試

 
 
 
 
  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 

總結

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

對于 Operator 來說建議能寫單元測試的還是寫單元測試,能夠本地寫集成測試的就寫集成測試這樣我們在實際上線的時候就會減少 bug 的概率,因為相對于業(yè)務代碼來說 Operator 的測試實在是比較麻煩,對于測試同學的要求也比較高,一不小心就有可能遺漏一些問題。


分享名稱:一篇帶你kubebuilder進階:測試
標題來源:http://www.5511xx.com/article/djissip.html