unit-testing - 单元测试 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
}
由于这不仅可以针对外部系统(k8s
api服务器)运行,而且还应该从Pod
部署后的内部运行,那么对它进行单元测试的适当方法是什么?
在 e2e 或集成测试中涵盖该案例是否是一种可接受的做法?
解决方案
您可以使用 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
推荐阅读
- c++ - 将 2 个 openssl 与 libcurl 链接时:错误设置证书验证位置
- ios - 是否可以检测附近没有我的应用的 iOS 设备?
- c# - 有没有办法将本地数据库与 Azure 上托管的 ASP.NET 核心 Web 应用程序一起使用?
- javascript - Threejs - 动画 fjdxsu 的公式
- sql - 如何连接两列,其中表 A 的日期介于 Oracle SQL 中表 B 的日期之间?
- dataframe - 如何连接具有列值的表
- powerbi - 每天查找最早和最晚的时间戳,创建计算列,中间有时间
- node.js - 发布获取缩放 oauth2.0 令牌的请求导致 403 错误
- r - Kmeans 聚类数据存储/绘图
- node.js - 为什么Node父进程使用子进程on message事件来处理子进程发送的消息