Golang ist eine statisch typisierte Open-Source-Programmiersprache, die von immer mehr Entwicklern begrüßt und geliebt wird. Beim Schreiben von Testcode ist es häufig erforderlich, Scheindaten zu verarbeiten. In diesem Artikel befassen wir uns mit der Verwendung von Mock in Golang und der Verarbeitung von Mock-Daten in verschiedenen Szenarien.
1. Warum ist Mocking erforderlich? , Nachrichtenwarteschlangen usw.) Code. Dies erfordert, dass wir mithilfe der Mocking-Technologie die Antwortergebnisse dieser abhängigen Dienste simulieren, um sicherzustellen, dass der Testcode unabhängig und schnell ausgeführt werden kann.
Darüber hinaus kann Mocking auch zum Testen der Randbedingungen des Codes (z. B. ungewöhnliche Situationen, z. B. nicht den Anforderungen entsprechende Eingabedaten usw.) verwendet werden, um die Robustheit und Zuverlässigkeit des Codes zu verbessern .
2. Mocking-Tools in Golang
Es gibt viele Mocking-Tools zur Auswahl in Golang, einige der beliebtesten Tools sind:
# 🎜🎜#testify: Bietet Spott- und Behauptungsfunktionen, sehr einfach zu verwenden. Es kann zur Simulation gängiger Datenquellen und -ausgaben wie Datenbanken, HTTP-Anfragen und anderer Dienste verwendet werden.
Mockery: Relativ gesehen ist dieses Tool leichter. Es kann Mock-Code schnell und genau generieren und unterstützt die Mocking-Funktion zur Laufzeit. Darüber hinaus unterstützt Mockery die Ausgabe von Vorlagen beim Generieren von Mock-Code, was Benutzern mehr anpassbare Optionen bieten kann. - Mockery/Mockery: Im Vergleich zum oben genannten Spott ist dieses Tool stärker auf die Bedürfnisse von Go-Sprachentwicklern ausgerichtet. Es bietet eine flexiblere API, die die Testbarkeit von Code ermöglicht. Neben der Unterstützung von Scheinschnittstellenmethoden kann Mockery auch nicht aufdringliche externe Abhängigkeiten nachahmen.
-
- 3. Verwenden Sie testify für Mocking
Im Folgenden verwenden wir testify als Mocking-Tool und zeigen anhand eines Beispiels, wie Sie die Mocking-Technologie zum Testen von Code verwenden.
Wir gehen davon aus, dass die folgende Funktion auf einer externen HTTP-API basiert, um Daten zu erhalten:
func getOrderDetail(orderID int) (OrderDetail, error){
resp, err := http.Get("https://api.example.com/order/"+strconv.Itoa(orderID))
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("getOrderDetail API returns error status code: %d", resp.StatusCode)
}
var orderDetail OrderDetail
return orderDetail, json.NewDecoder(resp.Body).Decode(&orderDetail)
}
Nach dem Login kopieren
Um diese Funktion zu testen, müssen wir die HTTP-Anfrage verspotten. testify bietet zwei Methoden, MockHTTPServer und RoundTripper, um das Verspotten von HTTP-Anfragen zu implementieren.
Schauen wir uns zunächst an, wie man MockHTTPServer verwendet:
func TestGetOrderDetail(t *testing.T) {
// 创建一个mock server
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 按照需要返回数据
if r.URL.Path == "/order/123" {
fmt.Fprintln(w, "{\"orderID\":123,\"createDate\":\"2021-01-01\"}")
} else {
http.Error(w, "not found", http.StatusNotFound)
}
}))
defer server.Close()
// 将http client的请求地址指向mock server
oldClient := http.DefaultClient
http.DefaultClient = server.Client()
defer func() { http.DefaultClient = oldClient }()
// 调用 getOrderDetail() 函数
orderDetail, err := getOrderDetail(123)
// 对 getOrderDetail() 的返回结果进行断言
assert.Nil(t, err)
assert.Equal(t, 123, orderDetail.OrderID) // 假设OrderDetail中包含了字段 OrderID
// 按照需要进行其他断言
}
Nach dem Login kopieren
In diesem Beispiel verwenden wir die Methode httptest.NewServer(), um den Mock-Server zu erstellen, und dann in seiner handlerFunc() simuliert es die Rückgabe der Antwort und des Statuscodes der HTTP-Anfrage.
Als nächstes verweisen wir http.DefaultClient auf den Mock-Server, damit getOrderDetail() beim Aufruf während des Tests eine Anfrage an den Mock-Server senden kann.
Abschließend verwenden wir die Assertionsmethode von testify, um die zurückgegebenen Ergebnisse zu überprüfen und die Korrektheit der Funktion sicherzustellen.
Zusätzlich zu MockHTTPServer bietet testify auch die RoundTripper-Methode zum Verspotten von HTTP-Anfragen. Diese Methode bietet eine flexiblere und kontrollierbarere Möglichkeit, HTTP-Anfragen zu simulieren. Benutzer können die Implementierung von RoundTripper anpassen, um jederzeit zur Scheindatenquelle zu wechseln und so den Testprozess besser zu steuern. Leser können sich auf die offizielle Dokumentation von testify beziehen, um mehr über die Verwendung dieser Methode zu erfahren.
4. Verwenden Sie Spott zum Spotten
Zusätzlich zur Aussage können wir auch Spott zum Spotten verwenden. Mockery basiert auf der integrierten Mock-Bibliothek der Sprache (http://golang.org/pkg/mock/) und bietet ein Code-Generierungstool, das ein Framework für wiederverwendbaren Mock-Code generieren kann. Mockery unterstützt die Generierung von Schnittstellen- und externen Abhängigkeits-Mock-Codes. Im Folgenden stellen wir den Schnittstellenmodus Mocking vor.
Zuerst müssen wir das Spott-Generierungstool installieren:
go get github.com/vektra/mockery/v2/.../
Nach dem Login kopieren
Dann definieren wir eine Schnittstelle und fügen ihr eine Methode hinzu:
type OrderDetailFetcher interface {
FetchOrderDetail(orderID int) (OrderDetail, error)
}
Nach dem Login kopieren
Führen Sie dann im Stammverzeichnis des Projekts den folgenden Befehl aus, um Mock-Code zu generieren:
mockery --name OrderDetailFetcher
Nach dem Login kopieren
Nach dem Login kopieren
Dadurch wird automatisch eine Datei mit dem Namen „mock_orderdetailfetcher.go“ generiert, die bereits den automatisch generierten Mock-Code enthält. Wir können diesen Mock-Code in jedem Code verwenden, um die Mock-Daten der Schnittstelle zu implementieren und die Testaufgabe abzuschließen.
Abschließend geben wir ein konkretes Beispiel, um zu demonstrieren, wie Spott zum Generieren von Mocking-Code verwendet wird:
type OrderDetail struct {
OrderID int
CreateDate string
}
type OrderDetailFetcher interface {
FetchOrderDetail(orderID int) (OrderDetail, error)
}
func GetOrderDetail(fetcher OrderDetailFetcher, orderID int) (OrderDetail, error) {
orderDetail, err := fetcher.FetchOrderDetail(orderID)
if err != nil {
return OrderDetail{}, err
}
return orderDetail, nil
}
Nach dem Login kopieren
In diesem Beispiel definieren wir ein Objekt mit dem Namen „OrderDetailFetcher“-Schnittstelle und implementiert eine GetOrderDetail()-Funktion, die die Verwendung der FetchOrderDetail()-Methode in der OrderDetailFetcher-Schnittstelle erfordert, um Bestelldetails abzurufen. Wir können den Befehl „spotery“ verwenden, um automatisch den Mock-Code für die Methode FetchOrderDetail() zu generieren:
mockery --name OrderDetailFetcher
Nach dem Login kopieren
Nach dem Login kopieren
Dieser Befehl generiert eine Datei mit dem Namen „mock_orderdetailfetcher.go“ im aktuellen Verzeichnis, die den automatisch generierten Code enthält Scheincode. Wir müssen nur den Mock-Code mit unserem Testcode kombinieren, um die Funktionstestaufgabe abzuschließen.
func TestGetOrderDetail(t *testing.T) {
orderDetail := OrderDetail{OrderID: 123, CreateDate: "2021-01-01"}
// 创建一个mock对象
mockOrderDetailFetcher := &mocks.OrderDetailFetcher{}
// 设定mock对象的mock调用及对应的返回结果
mockOrderDetailFetcher.On("FetchOrderDetail", 123).Return(orderDetail, nil)
// 调用GetOrderDetail()函数
result, err := GetOrderDetail(mockOrderDetailFetcher, 123)
// 校验返回结果及错误码
assert.Nil(t, err)
assert.Equal(t, orderDetail, result)
}
Nach dem Login kopieren
In diesem Beispiel definieren wir ein MockOrderDetailFetcher-Objekt und verwenden die On()-Methode in der Mock-Bibliothek, um eine bestimmte Aufrufregel und entsprechende Ergebnisse für ihre FetchOrderDetail()-Methode anzugeben – –OrderDetail-Objekt zurückgeben, wenn Bestell-ID ist 123. Beim Abrufen von FetchOrderDetail(123) von mockOrderDetailFetcher gibt der Testcode direkt das vorkonfigurierte orderDetail-Objekt zurück. Abschließend verwenden wir die Assertion-Methode von testify, um die Ergebnisse zu überprüfen.
Zusammenfassung
In diesem Artikel stellen wir das relevante Wissen über Mocking in Golang und gängige Mocking-Tools vor und zeigen außerdem, wie man Testify- und Mocking-Tools verwendet, um Mocking-Operationen durchzuführen und Mock-Tests der Zielfunktion abzuschließen. Durch sinnvolle und korrekte Anwendung der Mocking-Technologie können wir die Lesbarkeit, Robustheit, Zuverlässigkeit und andere Aspekte des Codes verbessern. Gleichzeitig kann Mocking uns auch dabei helfen, mögliche Probleme in verschiedenen Codes schnell zu lokalisieren und zu lösen sowie die Abdeckung und Genauigkeit des Testcodes zu verbessern.
Das obige ist der detaillierte Inhalt vonBesprechen Sie die Verwendung von Mock in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!