如何使用假客户端为 client-go 编写简单的测试?
How to write simple tests for client-go using a fake client?
问题
我正在寻找正确的方法来测试下面的代码,我找不到任何示例,我该怎么做。只有 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")
}
问题
我正在寻找正确的方法来测试下面的代码,我找不到任何示例,我该怎么做。只有 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")
}