Heim  >  Artikel  >  Backend-Entwicklung  >  Besprechen Sie die Verwendung von Mock in Golang

Besprechen Sie die Verwendung von Mock in Golang

PHPz
PHPzOriginal
2023-04-23 19:29:061549Durchsuche

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.
  1. 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.
  2. 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)
}
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

    // 按照需要进行其他断言
}
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/.../
Dann definieren wir eine Schnittstelle und fügen ihr eine Methode hinzu:

type OrderDetailFetcher interface {
    FetchOrderDetail(orderID int) (OrderDetail, error)
}
Führen Sie dann im Stammverzeichnis des Projekts den folgenden Befehl aus, um Mock-Code zu generieren:

mockery --name OrderDetailFetcher
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
}
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
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)
}
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn