Unit-Test-HTTP-Anforderungswiederholungen mit httptest
Der PHP-Editor Baicao stellt Ihnen ein Unit-Test-Tool namens „httptest“ vor, das Entwicklern beim erneuten Testen von HTTP-Anfragen helfen kann. Dieses Tool kann nicht nur verschiedene HTTP-Anfragen simulieren, sondern auch Anfragen automatisch wiederholen, um die Stabilität und Zuverlässigkeit des Codes sicherzustellen. Mit dem httptest-Tool können Entwickler problemlos HTTP-Anfragen Unit-Tests durchführen und Anfragen als Reaktion auf Netzwerkinstabilität oder andere ungewöhnliche Situationen problemlos wiederholen. Die Verwendung dieses Tools kann die Entwicklungseffizienz erheblich verbessern und die Fehlerwahrscheinlichkeit verringern. Es ist ein Tool, das für jeden PHP-Entwickler einen Versuch wert ist.
Frageninhalt
Ich versuche, Komponententests für eine Komponente namens HttpRequest
zu schreiben, die HTTP-Anfragen umschließt und das Unmarshalling von Antworten übernimmt. Kürzlich habe ich dieser Komponente eine Funktion hinzugefügt, die es ihr ermöglicht, HTTP-Anfragen erneut zu versuchen, wenn beim ersten Versuch ein Fehler „Verbindung abgelehnt“ auftritt.
Um die HttpRequest-Komponente zu verwenden, rufe ich sie einmal auf: user, err := HttpRequest[User](config)
。 config 参数包含执行请求的所有必要信息,例如 URL、方法、超时、重试次数和请求正文。它还将响应正文解组为指定类型的实例(在本例中为 User
)
Das Problem tritt auf, wenn ich versuche, ein Szenario zu testen, in dem die erste Anfrage mit der Fehlermeldung „Verbindung abgelehnt“ fehlschlägt, der zweite Versuch jedoch erfolgreich ist. Der Wiederholungsversuch erfolgt innerhalb der Komponente, daher rufe ich die Komponente nur einmal auf.
Ich fand es schwierig, Komponententests für dieses Szenario zu erstellen, denn damit die Anfrage mit „Verbindung abgelehnt“ fehlschlägt, muss am aufgerufenen Port kein Listener vorhanden sein. Das Problem ist, dass ich bei Verwendung der httptest
时,它总是在创建实例时侦听端口,即使使用 httptest.NewUnstartedServer
也是如此。因此,在创建 httptest
-Instanz nie die Fehlermeldung „Verbindung abgelehnt“ in meinem Clientcode erhalte.
Der HttpRequest-Aufruf erfolgt jedoch, bevor die httptest
实例之前,我不知道它将侦听哪个端口。 httptest
总是选择一个随机端口,并且无法以编程方式指定一个端口。这意味着我无法在创建 httptest
-Instanz erstellt wird.
Hat jemand eine Idee, wie man dieses Szenario effektiv einem Unit-Test unterziehen kann?
Lösung
newunstartedserver
Ganz einfach:
func newunstartedserver(handler http.handler) *server { return &server{ listener: newlocallistener(), config: &http.server{handler: handler}, } }
Wenn es das Richtige für Sie ist, selbst einen Port zu wählen, können Sie Folgendes tun:
func mynewunstartedserver(port int, handler http.handler) *httptest.server { addr := fmt.sprintf("127.0.0.1:%d", port) l, err := net.listen("tcp", addr) if err != nil { addr = fmt.sprintf("[::1]::%d", port) if l, err = net.listen("tcp6", addr); err != nil { panic(fmt.sprintf("httptest: failed to listen on a port: %v", err)) } } return &httptest.server{ listener: l, config: &http.server{handler: handler}, } }
Der Code zum Erstellen des Listeners wurde von httptest.newlocallistener
geändert.
Eine weitere Möglichkeit ist die Umsetzung http.roundtripper
接口并使用此 roundtripper 创建一个 http.client
. Hier ist ein Beispiel http/client_test.go, kopiert von net/:
type recordingTransport struct { req *Request } func (t *recordingTransport) RoundTrip(req *Request) (resp *Response, err error) { t.req = req return nil, errors.New("dummy impl") } func TestGetRequestFormat(t *testing.T) { setParallel(t) defer afterTest(t) tr := &recordingTransport{} client := &Client{Transport: tr} url := "http://dummy.faketld/" client.Get(url) // Note: doesn't hit network if tr.req.Method != "GET" { t.Errorf("expected method %q; got %q", "GET", tr.req.Method) } if tr.req.URL.String() != url { t.Errorf("expected URL %q; got %q", url, tr.req.URL.String()) } if tr.req.Header == nil { t.Errorf("expected non-nil request Header") } }
Das obige ist der detaillierte Inhalt vonUnit-Test-HTTP-Anforderungswiederholungen mit httptest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...
