Wenn ich Code habe, der mit einer net.Conn
funktioniert, wie kann ich Tests dafür schreiben, ohne tatsächlich eine Netzwerkverbindung zu localhost zu erstellen?Wie können Sie Code testen, der auf net.Conn basiert, ohne eine tatsächliche Netzwerkverbindung zu erstellen?
Ich habe online keine Lösungen zu diesem Thema gesehen; Leute scheinen es entweder zu ignorieren (keine Tests), schreiben Tests, die nicht parallel laufen können (dh verwenden Sie eine tatsächliche Netzwerkverbindung, die Up-Ports verwendet), oder verwenden Sie io.Pipe.
Jedoch definiert net.Conn
SetReadDeadline
, SetWriteDeadline
; und io.Pipe nicht. net.Pipe auch tut, trotz vordergründig um die Schnittstelle zu implementieren behauptet, es ist einfach mit umgesetzt:
func (p *pipe) SetDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
func (p *pipe) SetReadDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
func (p *pipe) SetWriteDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
(siehe: https://golang.org/src/net/pipe.go)
So ... gibt es eine andere Art und Weise, dies zu tun?
Ich werde jede Antwort akzeptieren, die zeigt, wie man einen Stream in einem Test mit einem Arbeitsende verwendet, das kein tatsächlicher Netzwerk-Socket ist.
(Idly, diese cloudflare blogpost deckt die Motivation für die Verwendung von Deadlines, und warum Blockieren für immer in einer Goroutine pro Verbindung ist keine akzeptable Lösung; aber unabhängig von diesem Argument, insbesondere in diesem Fall suche ich nach einer Lösung für testet, wo wir, wo eine schlechte Verbindung hängt, etc.)
(NB. dies wie ein Duplikat Simulate a tcp connection in Go scheinen mag, aber feststellen, dass die alle vorgeschlagenen Lösungen in dieser Frage bewusst behandeln Fälle Kante wollen nicht die Frist umsetzen Funktionen, die genau das ist, was ich frage, wie man hier testet)
Warum können Sie keine Netzwerkverbindung verwenden? Die meisten Tests, die ein net.Conn erfordern, verwenden normalerweise einen anderen lokalen Endpunkt unter Kontrolle des Tests. – JimB
Sie müssen das Protokoll der Netzwerkkarte überprüfen (Ethernet/WLAN, ...). – bilelovitch
Sicherlich einen tatsächlichen Netzwerkanschluss pro Test zu skalieren, skaliert nicht, wenn Sie viele viele Tests haben? (parallel laufen ...) Was machst du, wählst einen zufälligen Port und hoffst? Weisen Sie einen Port-Pool zu und binden Sie die Ports optimistisch, bis Sie einen freien finden? – Doug