3 回答

TA貢獻1794條經驗 獲得超8個贊
更新:這個答案已經過時了。
“不幸的是,[這個]答案已經有好幾年了。以前它是“盡力而為”的支持,但團隊去年決定不再支持在 Go 中導入 Vault、API 或 SDK 作為模塊。我帶來不便敬請諒解?!?/p>
--
有沒有一種簡單的方法可以在 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。

TA貢獻1900條經驗 獲得超5個贊
需要注意的一件非常重要的事情:
TestCoreUnsealed
不使用常規的 KV 后端,而是使用 aPassthroughBackend
來本質上模擬 kv 行為。

TA貢獻1844條經驗 獲得超8個贊
因為 Go 是一種靜態類型語言,所以我們必須在編譯時知道事物的類型。因此,要進行這種類型的獨立測試,我們需要在代碼中創建在測試方面具有邏輯意義的邊界。
在 Go 中創建接口來定義這些邊界,因此從這個意義上說,您希望在您和此第三方庫之間創建一個接口,以便您可以用您可以控制的函數/方法/類型替換庫函數/方法/類型的輸入和輸出并定義了條件,以便您可以測試代碼對第三方的輸出或條件的行為方式。
- 3 回答
- 0 關注
- 181 瀏覽
添加回答
舉報