在去测试中,有没有一种简单的方法可以模拟Hashicorp保险库?
我在Go中创建了一个可访问保险柜的服务,并希望为其创建适当的测试。
我没有找到我喜欢的简单解决方案(例如python中的moto)。 我还尝试在docker中以开发人员模式使用保管库(采用系统测试路线),但是我无法通过API写入保管库。 想法?
答案 0 :(得分:5)
在Go测试中,有没有一种简单的方法可以模拟HashiCorp Vault?
不要。使用真实的东西! 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中解释了理性。
答案 1 :(得分:2)
由于Go是一种静态类型的语言,我们必须在编译时知道事物的类型。因此,要进行这种类型的独立测试,我们需要在代码中创建在测试方面具有逻辑意义的边界。
在Go中创建接口来定义这些边界,因此从这个意义上讲,您想在您与该第三方库之间创建一个接口,以便可以将库函数/方法/类型的输入和输出替换为您可以控制并定义条件,以便测试代码对第三方输出或条件的行为。
有关接口的示例,请参见以下内容。
https://gobyexample.com/interfaces
如果您共享一些示例代码,也许我们可以更具体一些,并为您提供一些代码示例。
答案 2 :(得分:1)
需要注意的一件事:
TestCoreUnsealed
不使用常规的KV后端,而是使用PassthroughBackend
来模拟kv行为。
此问题之后,我花了4天的时间对此进行调试