首页 > 解决方案 > 单元测试 client-go 函数,它验证并返回 k8s 客户端集

问题描述

我正在编写可能使用的最简单的 fxn client-go,它只执行集群内身份验证并返回指向kubernetes.Clientset对象的指针

// getInClusterAuth performs in cluster authentication and returns the clientset
func getInClusterAuth() (*kubernetes.Clientset, error) {
    // creates the in-cluster config
    config, err := rest.InClusterConfig()
    if err != nil {
        return nil, err
    }
    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }

    return clientset, nil
}

由于这不仅可以针对外部系统(k8sapi服务器)运行,而且还应该从Pod部署后的内部运行,那么对它进行单元测试的适当方法是什么?

在 e2e 或集成测试中涵盖该案例是否是一种可接受的做法?

标签: unit-testinggotestingkubernetesclient-go

解决方案


您可以使用 k8s.io/client-go/kubernetes/fake.NewSimpleClientset 在单元测试中模拟 clientSet 。


import (
        "context"
        "testing"

        v1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/kubernetes/fake"
)

func TestHelloWorld(t *testing.T) {
        clientset := fake.NewSimpleClientset(&v1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                        Name:        "influxdb-v2",
                        Namespace:   "default",
                        Annotations: map[string]string{},
                },
        }, &v1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                        Name:        "chronograf",
                        Namespace:   "default",
                        Annotations: map[string]string{},
                },
        })

        _, err := clientset.CoreV1().Pods(v1.NamespaceDefault).Get(context.Background(), "influxdb-v2", metav1.GetOptions{})
        if err != nil {
                if errors.IsNotFound(err) {
                        t.Error(err)
                } else {
                        t.Errorf("failed to get service from apiserver: %s", err)
                }
        }

        p := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "helloooooo"}}
        _, err = clientset.CoreV1().Pods(v1.NamespaceDefault).Create(context.Background(), p, metav1.CreateOptions{})
        if err != nil {
            t.Fatalf("error injecting pod add: %v", err)
        }
}

这是一个示例:a fakeclient case


推荐阅读