Eine Go-CAPTCHA-Integration testen, ohne Guthaben zu verbrauchen
Richten Sie das offizielle Go-SDK mit NewClientWithBaseURL auf einen httptest-Server aus. Der Server liefert die Task-Antworten, sodass Sie das SDK testen können, ohne solvethree-Guthaben zu verbrauchen oder geheime Anwendungsdaten anzugeben.
Auf dieser Seite
Das SDK mit einer lokalen Test-Fixture ausführen
- 1.
Abhängigkeit installieren
Verwenden Sie Go 1.22 oder neuer. Installieren Sie in Ihrem Go-Modul mit
go getdas Modulsolvethree.com/[email protected]. Das Modul wird über solvethree.com bereitgestellt. - 2.
Test speichern und ausführen
Speichern Sie das Beispiel als
captcha_integration_test.goin einem reinen Testverzeichnis innerhalb Ihres Moduls und führen Sie dortgo testaus. Lassen Sie den Fixture-Schlüssel, den Hostnamen und den Proxy unverändert: Das sind Testdaten, keine Zugangsdaten oder Dienste, die Sie konfigurieren müssen.
package integration_test
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"sync/atomic"
"testing"
"time"
solvethree "solvethree.com/sdk"
)
func TestSolve(t *testing.T) {
var posts atomic.Int32
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if r.Method == "POST" {
posts.Add(1)
fmt.Fprint(w, `{"id":"fixture-1","status":"pending"}`)
return
}
fmt.Fprint(w, `{"id":"fixture-1","status":"ready","solution":{"token":"FIXTURE_TOKEN","userAgent":"fixture-browser-identity","secChUa":"fixture-hints"}}`)
}))
defer server.Close()
client, err := solvethree.NewClientWithBaseURL("fixture-key", server.URL, nil)
if err != nil { t.Fatal(err) }
result, err := client.Solve(context.Background(), solvethree.TaskRequest{
Site: "accounts.example.com", Action: "login", Proxy: "http://proxy.example:8080",
}, solvethree.SolveOptions{Timeout: time.Second, PollInterval: time.Millisecond})
if err != nil { t.Fatal(err) }
if result.Solution.Token != "FIXTURE_TOKEN" || posts.Load() != 1 { t.Fatal("incorrect lifecycle") }
}NewClientWithBaseURL akzeptiert für Tests HTTP über die Loopback-Adresse. Hier ersetzt server.URL die Produktionsadresse der API, und der Handler antwortet lokal. Der Proxy-Wert ist lediglich Teil des übermittelten Tasks; diese Fixture stellt keine Verbindung zu ihm her.
Was der bestandene Test nachweist
Nach der POST-Antwort bleibt der Task im Status pending. Eine nachfolgende Anfrage erhält eine ready-Antwort mit FIXTURE_TOKEN. Die abschließende Assertion prüft sowohl das zurückgegebene Token als auch, dass genau ein POST gesendet wurde. So erkennt sie, wenn in diesem Ablauf versehentlich ein zusätzlicher Task erstellt wird.
Der Handler ist bewusst einfach gehalten: Jede Anfrage, die kein POST ist, erhält die ready-Antwort. Er prüft weder die Polling-Methode noch den Anfragepfad oder das übermittelte JSON. Um auch den Anfragevertrag zu testen, lassen Sie den Handler die erwarteten Routen für die Erstellung und den Task-Abruf sowie die übermittelte Site, Aktion und den Proxy prüfen.
Ein bestandener Test weist nach, dass der simulierte SDK-Lebenszyklus funktioniert. Er validiert weder ein echtes Site-Profil noch einen Proxy oder die Akzeptanz des Tokens durch das Ziel. Das zurückgegebene Token und die Browseridentität sind Fixture-Werte.
Fehlerfälle an den Entscheidungspunkten Ihrer Integration ergänzen
Erweitern Sie den lokalen Handler so, dass er die Bedingungen zurückgibt, die Ihre Anwendung behandeln muss. Behalten Sie den POST-Zähler bei: Die Wiederholung einer Polling-Anfrage sollte keinen weiteren Task erstellen.
| Verhalten der Fixture | Was zu prüfen ist |
|---|---|
| Eine Polling-Anfrage gibt HTTP 429, 502, 503 oder 504 zurück, danach ready. | Solve wiederholt vorübergehend fehlgeschlagene Polling-Anfragen, berücksichtigt Retry-After innerhalb der Frist und sendet weiterhin nur einen POST. |
| Der Task wechselt in den Status failed mit errorCode site-unreachable und einer Fehlermeldung. | Behandeln Sie *solvethree.TaskFailedError und beenden Sie das Polling für diesen Task. Sein ErrorCode identifiziert den Fehler; rufen Sie den fehlgeschlagenen Task ab, wenn Sie seinen Error-Text benötigen. |
| Die Erstellung gibt eine nicht erfolgreiche HTTP-Antwort zurück. | Behandeln Sie den HTTP-Fehler, statt die Antwort als erfolgreichen Task zu interpretieren. Extrahieren Sie mit errors.As den Fehler *solvethree.APIError und prüfen Sie StatusCode. |
| Der Task bleibt bis zum Ablauf der Frist im Status pending. | Erkennen Sie context.DeadlineExceeded mit errors.Is. Ein Timeout beendet das Warten, bricht aber die Arbeit auf dem Server nicht ab. |
| Der Server registriert die Erstellung, aber der Client verliert die Antwort. | Prüfen Sie die Wiederherstellungsinformationen in *solvethree.Error. CreateTask wiederholt POST nicht automatisch. Stellen Sie den Zugriff mit GetTask wieder her, wenn TaskID bekannt ist, oder senden Sie die exakt ursprünglichen Eingaben mit derselben RequestID erneut. |
Geben Sie dem Test für den Fall einer verlorenen Antwort eine explizite Anfrage-ID und lassen Sie die Fixture den bestehenden Task zurückgeben, wenn diese ID mit denselben Eingaben erneut gesendet wird. Andernfalls testen Sie eine zweite Erstellung statt der Wiederherstellung.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.