3 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
更新:這個(gè)答案已經(jīng)過時(shí)了。
“不幸的是,[這個(gè)]答案已經(jīng)有好幾年了。以前它是“盡力而為”的支持,但團(tuán)隊(duì)去年決定不再支持在 Go 中導(dǎo)入 Vault、API 或 SDK 作為模塊。我?guī)?lái)不便敬請(qǐng)諒解?!?/p>
--
有沒有一種簡(jiǎn)單的方法可以在 Go 測(cè)試中模擬 HashiCorp Vault?
不。使用真實(shí)的東西!HashiCorp 提供了用于動(dòng)態(tài)啟動(dòng)服務(wù)器的實(shí)用函數(shù)1。這使得您的測(cè)試更加有用,并且通常可以作為開發(fā)人員如何設(shè)置本地開發(fā)服務(wù)器的可行指南。
這是一個(gè)非常基本的例子。測(cè)試框架非常靈活(這也使得它相當(dāng)復(fù)雜)。請(qǐng)參閱軟件包文檔了解更多選項(xiàng),包括在 HA 模式下運(yùn)行多個(gè)服務(wù)器。我發(fā)現(xiàn) Vault 自己的測(cè)試用例在設(shè)置更復(fù)雜的場(chǎng)景時(shí)非常有用。
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他們?yōu)樗许?xiàng)目提供測(cè)試服務(wù)器,而不僅僅是 Vault。

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
需要注意的一件非常重要的事情:
TestCoreUnsealed
不使用常規(guī)的 KV 后端,而是使用 aPassthroughBackend
來(lái)本質(zhì)上模擬 kv 行為。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
因?yàn)?Go 是一種靜態(tài)類型語(yǔ)言,所以我們必須在編譯時(shí)知道事物的類型。因此,要進(jìn)行這種類型的獨(dú)立測(cè)試,我們需要在代碼中創(chuàng)建在測(cè)試方面具有邏輯意義的邊界。
在 Go 中創(chuàng)建接口來(lái)定義這些邊界,因此從這個(gè)意義上說,您希望在您和此第三方庫(kù)之間創(chuàng)建一個(gè)接口,以便您可以用您可以控制的函數(shù)/方法/類型替換庫(kù)函數(shù)/方法/類型的輸入和輸出并定義了條件,以便您可以測(cè)試代碼對(duì)第三方的輸出或條件的行為方式。
- 3 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報(bào)