自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇帶你kubebuilder 進階: 測試

開發(fā) 項目管理
今天我們大概看一下單元測試和集成測試怎么做。單元測試和 golang 的單元測試沒有什么太大的區(qū)別,一般可以通過單元測試搞定的首先使用單元測試,因為單元測試寫起來最容易。

[[399666]]

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

單元測試

單元測試和 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表示使用一個已經存在的控制平面
  • KUBEBUILDER_ASSETS 本地控制平面二進制文件的文件夾路徑,里面包含了 kubectl apiserver和 etcd
  • KUBEBUILDER_CONTROLPLANE_START_TIMEOUT控制平面啟動的超時時間
  • KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT控制平面停止的超時時間

編寫測試

kubebuilder 在生成代碼的時候已經幫我們生成好了相關的腳手架,已經環(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 的測試實在是比較麻煩,對于測試同學的要求也比較高,一不小心就有可能遺漏一些問題。

 

責任編輯:姜華 來源: mohuishou
相關推薦

2021-05-18 05:40:27

kubebuilderwebhook進階

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

2021-05-20 06:57:16

RabbitMQ開源消息

2023-04-20 08:00:00

ES搜索引擎MySQL

2021-07-26 09:31:09

自動化測試編程語言手機編程

2021-06-16 08:28:25

unary 方法函數技術

2022-03-10 08:31:51

REST接口規(guī)范設計Restful架構

2025-01-17 07:00:00

2022-02-24 07:56:42

開發(fā)Viteesbuild

2021-10-27 09:59:35

存儲

2022-02-21 09:44:45

Git開源分布式

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2021-07-28 10:02:54

建造者模式代碼

2021-07-14 08:24:23

TCPIP 通信協(xié)議

2022-04-08 08:32:40

mobx狀態(tài)管理庫redux

2021-08-11 07:02:21

npm包管理器工具
點贊
收藏

51CTO技術棧公眾號