在golang端到端测试中模拟kubernetes集群?

问题描述 投票:0回答:1

我有一系列用 golang 编写的端到端测试。正在测试的功能通过 helm 连接到 kubernetes 集群。我的问题是 - 有没有一种好的方法来创建虚拟 kubernetes 集群。例如。这是一些正在测试的代码:

import (
    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/release"
)

func (h *Helm) GetMyRelease(name string) (*release.Release, error) {
    cmd := action.NewGet(h.config)
    release, err := cmd.Run(name)
    if err != nil {
        return nil, err
    }
    return release, nil
}

上面的

Run
函数就像这样

func (g *Get) Run(name string) (*release.Release, error) {
    if err := g.cfg.KubeClient.IsReachable(); err != nil {
        return nil, err
    }

    return g.cfg.releaseContent(name, g.Version)
}

在 helm golang 包中。

我尝试使用 k3d 创建本地 kubernetes 集群,但它似乎没有按我的预期工作 - 我无法通过它创建“真正的”KubeClient。
有什么建议么? 谢谢!

go kubernetes kubernetes-helm k3d
1个回答
0
投票

您是否正在尝试测试 Kubernetes 和/或 Helm 或使用 Helm API 时代码的行为?

如果您要测试的是您的代码,则需要创建您正在使用的 API 的抽象,以便您可以模拟响应以在可能出现的所有条件下练习代码的行为通过外部依赖。

这可能看起来工作量很大,但未来会感谢你;有了抽象,您的测试就可以有效地执行,而无需站起来并拆除任何外部依赖项。

有不同的方法可以实现这一点,这可能会导致类似的结果:

import (
    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/release"
)

type cmdRunner interface {
   Run(string) (*release.Release, error)
}

var getAction = func(cfg *action.Configuration) cmdRunner { return action.NewGet(cfg) }

func (h *Helm) GetMyRelease(name string) (*release.Release, error) {
    cmd := getAction(h.config)
    release, err := cmd.Run(name)
    if err != nil {
        return nil, err
    }
    return release, nil
}

这在功能上应该与之前的相同,但 Helm API 是通过函数变量调用的,而不是直接调用。

函数变量不会导出,并且无法在此包之外进行操作,但这对于单元测试来说是可以的(从包外部全面测试项目的内部集成测试可能需要您重新访问它,但这超出了问题的范围和这个答案)。

变量中的函数返回一个接口,描述您打算对返回值调用的

Run
方法。函数变量的初始值是调用Helm API代码的函数,返回满足接口的值。

有了这个,您现在可以编写一个单元测试,用一个替代函数替换

getAction
函数,返回您自己的接口实现,您可以操纵该实现来创建执行代码所需的条件。

这可能看起来与此类似:

type fakeRunner struct {
   release *release.Release
   error
}

func (fake *fakeRunner) Run(string) (*release.Release, error) {
   return fake.release, fake.error
} 

func TestGetMyRelease(t *testing.T) {
   // ARRANGE
   runner := &fakeRunner{}

   og := getAction
   defer func() { getAction = og }()
   getAction = func(*action.Configuration) { return runner }

   // ...
}

希望您现在可以清楚地了解如何在

fakeRunner
中设置返回值和/或错误,并使用代码来测试 Helm API 提供的不同结果时的行为,而无需运行实际的集群.

© www.soinside.com 2019 - 2024. All rights reserved.