go - 如何使用假客户端为 client-go 编写简单的测试?

标签 go client-go

问题

我正在寻找正确的方法来测试下面的代码,我找不到任何示例,我该怎么做。只有main_test.go但它缺少 main.go ,对我来说,如何使用它并不明显。 我还浏览了 Github issues但我找不到任何有用的东西。

功能:

import (
  "fmt"
  "k8s.io/api/core/v1"
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  fake "k8s.io/client-go/kubernetes/fake"
  "time"
)

func GetNamespaceCreationTime(namespace string) int64 {
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    ns, err := clientset.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("%v \n", ns.CreationTimestamp)
    return (ns.GetCreationTimestamp().Unix())
}

测试:

我认为我的测试应该如下所示,但是我如何使用 config := fake.NewSimpleClientset(),我应该将它传递给 GetNamespaceCreationTime 函数吗?

func TestGetNamespaceCreationTime(t *testing.T) {
  config := fake.NewSimpleClientset()
  got := GetNamespaceCreationTime("default")
  want := int64(1257894000)

  nsMock := config.CoreV1().Namespaces()
  nsMock.Create(&v1.Namespace{
    ObjectMeta: metav1.ObjectMeta{
      Name:              "default",
      CreationTimestamp: metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
    },
  })

  if got != want {
    t.Errorf("got %q want %q", got, want)
  }

最佳答案

您需要将初始化部分移到 GetNamespaceCreationTime 函数之外。您可以将 kubernetes.Interface 作为参数传递给该函数。

    import (
      "fmt"
      "k8s.io/api/core/v1"
      metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
      fake "k8s.io/client-go/kubernetes/fake"
      "k8s.io/client-go/kubernetes"
      "time"
    )

var getInclusterConfigFunc = rest.InClusterConfig
var getNewKubeClientFunc = dynamic.NewForConfig
   
    
    func GetNamespaceCreationTime(kubeClient kubernetes.Interface, namespace string) int64 {
    
        ns, err := kubeClient.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})
        if err != nil {
            panic(err.Error())
        }
        fmt.Printf("%v \n", ns.CreationTimestamp)
        return (ns.GetCreationTimestamp().Unix())
    }
    
    func GetClientSet() kubernetes.Interface {
      config, err := getInclusterConfigFunc()
      if err != nil {
        log.Warnf("Could not get in-cluster config: %s", err)
        return nil, err
      }

      client, err := getNewKubeClientFunc(config)
      if err != nil {
        log.Warnf("Could not connect to in-cluster API server: %s", err)
        return nil, err
      }

      return client, err
    }

然后您的测试函数可以实例化假客户端并调用该方法。

    func TestGetNamespaceCreationTime(t *testing.T) {
      kubeClient := fake.NewSimpleClientset()
      got := GetNamespaceCreationTime(kubeClient, "default")
      want := int64(1257894000)
    
      nsMock := config.CoreV1().Namespaces()
      nsMock.Create(&v1.Namespace{
        ObjectMeta: metav1.ObjectMeta{
          Name:              "default",
          CreationTimestamp: metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
        },
      })
    
      if got != want {
        t.Errorf("got %q want %q", got, want)
      }

func fakeGetInclusterConfig() (*rest.Config, error) {
    return nil, nil
}

func fakeGetInclusterConfigWithError() (*rest.Config, error) {
    return nil, errors.New("fake error getting in-cluster config")
}

func TestGetInclusterKubeClient(t *testing.T) {
    origGetInclusterConfig := getInclusterConfigFunc
    getInclusterConfigFunc = fakeGetInclusterConfig
    origGetNewKubeClient := getNewKubeClientFunc
    getNewKubeClientFunc = fakeGetNewKubeClient

    defer func() {
        getInclusterConfigFunc = origGetInclusterConfig
        getNewKubeClientFunc = origGetNewKubeClient
    }()

    client, err := GetClientSet()
    assert.Nil(t, client, "Client is not nil")
    assert.Nil(t, err, "error is not nil")
}

func TestGetInclusterKubeClient_ConfigError(t *testing.T) {
    origGetInclusterConfig := getInclusterConfigFunc
    getInclusterConfigFunc = fakeGetInclusterConfigWithError

    defer func() {
        getInclusterConfigFunc = origGetInclusterConfig
    }()

    client, err := GetInclusterKubeClient()
    assert.Nil(t, client, "Client is not nil")
    assert.NotNil(t, err, "error is nil")
}

关于go - 如何使用假客户端为 client-go 编写简单的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57833499/

相关文章:

oop - 如何强制将struct中的所有字段像OOP中的构造器一样填充?

go - go mod导入K8s Taints Api时出错

go - 使用 Openshift/Client-go 进行 Openshift API 查询

go - 如何获取给定 k8s 资源的 json 的 schema.GroupVersionResource

go - 如何获取集群外go Kubernetes客户端的当前命名空间?

web - 通过 websocket 将 kubernetes 日志暴露给浏览器

Golang - 如何使单个结构与多个结构一起工作?

json - Go Unmarshal json,其键可以是两种类型之一

golang protobuf 从生成的 json 标签中删除 omitempty 标签

go - Kubernetes client-go Remotecommand Stream 何时完成?