Question

Questions

  1. 对某个外部操作存在分支流程或者异常流程,在服务的整流程中如果非常多次涉及对它的调用。 那么在进行类端到端的FT测试中,对于这个外部操作进行打桩就需要考虑在整个N次调用的过程中,在其中每个位置或多个位置的分支和异常调用如何全部都测试到(枚举)?

参考资料


Go fake for k8s client

fake k8s client

在服务代码中,与k8s交互我们使用client,这个client中含有对接k8s的kubeconfig配置,并且具有需要跟k8s apiserver交互的方法接口。 在controller-runtime中,有一个client fake;用法见下面示例

import (
    "context"
    "testing"

    cachev1alpha1 "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1"
    "k8s.io/apimachinery/pkg/runtime"
    "sigs.k8s.io/controller-runtime/pkg/client"
    "sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestMemcachedController(t *testing.T) {
    ...
    // A Memcached object with metadata and spec.
    memcached := &cachev1alpha1.Memcached{
        ObjectMeta: metav1.ObjectMeta{
            Name:      "memcached",
            Namespace: "memcached-operator",
            Labels: map[string]string{
                "label-key": "label-value",
            },
        },
    }

    // Objects to track in the fake client.
    objs := []runtime.Object{memcached}

    // Create a fake client to mock API calls.
    cl := fake.NewFakeClient(objs...)

    // List Memcached objects filtering by labels
    opt := client.MatchingLabels(map[string]string{"label-key": "label-value"})
    memcachedList := &cachev1alpha1.MemcachedList{}
    err := cl.List(context.TODO(), memcachedList, opt)
    if err != nil {
        t.Fatalf("list memcached: (%v)", err)
    }
    ...
}

fake k8s build-in API

如果服务需要访问k8s的既有API接口,我们一般使用ClientSet,这是一个访问各种类型资源的客户端的集合。由库:k8s.io/client-go/kubernetes 所定义。 在使用时,代码实现如下:

type Client struct {
    ClientSet kubernetes.Interface  // 这里需要使用interface,而不是直接就是 kubernetes.ClientSet 这个具体的实现。否则fake clientSet不方便注入
}

func NewBuildinClient()(*Client, error){
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    return &Client{
        Clientset: clientset,
    }, nil
}

在fake 这个Clientset时,


import "k8s.io/client-go/kubernentes/fake"

func TestSample(t *testing.T) {
    ApplyFunc(NewBuildClient, func()(*Client, error){
        return &Client{
            Clientset: fake.NewSimpleClientset(),
        }, nil
    })

}

参考

  1. Unit testing with Operator SDK
  2. Mocking the Kubernetes client in Go for Unit Testing

—  原创作品许可 — 署名-非商业性使用-禁止演绎 3.0 未本地化版本 — CC BY-NC-ND 3.0   —