有没有一种简单的方法可以在Go测试中模拟Hashicorp保险库?

我在Go中创建了一个可访问保险柜的服务,并希望为其创建适当的测试。

我没有找到我喜欢的简单解决方案(例如python中的moto)。
我还尝试在docker中以dev模式使用Vault(采用系统测试路线),但是我无法通过API写入文件。
想法?

最佳答案



别。使用真实的东西! HashiCorp有用地提供了实用程序功能,用于动态启动服务器1。这使您的测试更加有用,并且经常可以作为开发人员如何设置本地开发服务器的可行指南。

这是一个非常基本的例子。测试框架非常灵活(这也使其变得相当复杂)。有关更多选项,请参阅软件包文档,包括以HA模式运行多个服务器。在设置更复杂的场景时,我发现Vault自己的测试用例非常有用。

package main

import (
    "net"
    "testing"

    "github.com/hashicorp/vault/api"
    "github.com/hashicorp/vault/http"
    "github.com/hashicorp/vault/vault"
)

func TestVaultStuff(t *testing.T) {
    ln, client := createTestVault(t)
    defer ln.Close()

    // Pass the client to the code under test.
    myFunction(client)
}

func createTestVault(t *testing.T) (net.Listener, *api.Client) {
    t.Helper()

    // Create an in-memory, unsealed core (the "backend", if you will).
    core, keyShares, rootToken := vault.TestCoreUnsealed(t)
    _ = keyShares

    // Start an HTTP server for the core.
    ln, addr := http.TestServer(t, core)

    // Create a client that talks to the server, initially authenticating with
    // the root token.
    conf := api.DefaultConfig()
    conf.Address = addr

    client, err := api.NewClient(conf)
    if err != nil {
        t.Fatal(err)
    }
    client.SetToken(rootToken)

    // Setup required secrets, policies, etc.
    _, err = client.Logical().Write("secret/foo", map[string]interface{}{
        "secret": "bar",
    })
    if err != nil {
        t.Fatal(err)
    }

    return ln, client
}

1他们为所有项目提供测试服务器,而不仅仅是Vault。 Mitchell Hashimoto在his talk on advanced testing中解释了理性。

08-28 03:33