בדיקת אינטגרציית CAPTCHA ב-Go בלי לצרוך יתרה

מאת solvethree3 דקות קריאה

הפנו את ה-SDK הרשמי של Go לשרת httptest באמצעות NewClientWithBaseURL. השרת מספק את תגובות המשימה, כך שאפשר לבדוק את ה-SDK בלי לנצל יתרה של solvethree או לספק סודות של היישום.

בדף הזה

הרצת ה-SDK מול סביבת בדיקה מקומית

  1. 1.

    התקינו את התלות

    השתמשו ב-Go בגרסה 1.22 ואילך. במודול ה-Go שלכם, השתמשו ב-go get כדי להתקין את solvethree.com/[email protected]. המודול מוגש מ-solvethree.com.

  2. 2.

    שמירת הבדיקה והרצתה

    שמרו את הדוגמה בשם captcha_integration_test.go בתיקייה המיועדת לבדיקות בלבד בתוך המודול, ואז הריצו go test מאותה תיקייה. השאירו את מפתח הבדיקה, שם המארח והפרוקסי ללא שינוי: אלה נתוני בדיקה, לא פרטי גישה או שירותים שעליכם להגדיר.

Go · בדיקת אינטגרציה מבודדת של ה-SDK
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 מאפשר שימוש ב-HTTP בכתובת loopback לצורך בדיקות. כאן, server.URL מחליף את כתובת ה-API של סביבת הייצור, וה-handler משיב מקומית. ערך הפרוקסי הוא רק חלק מהמשימה שנשלחת; סביבת הבדיקה הזו אינה מתחברת אליו.

מה מוכיחה הצלחה בבדיקה

תגובת ה-POST משאירה את המשימה בהמתנה. בקשה עוקבת מקבלת תגובה המציינת שהמשימה מוכנה ומכילה את FIXTURE_TOKEN. האימות האחרון בודק גם את הטוקן שהוחזר וגם שנשלח בדיוק POST אחד, וכך מזהה יצירה מקרית של משימה נוספת במהלך התהליך הזה.

ה-handler נשאר פשוט במכוון: כל בקשה שאינה POST מקבלת את התגובה המציינת שהמשימה מוכנה. הוא אינו מאמת את מתודת התשאול, נתיב הבקשה או ה-JSON שנשלח. כדי לבדוק גם את חוזה הבקשות, הגדירו את ה-handler כך שיבדוק את נתיבי היצירה ושליפת המשימה הצפויים, וכן את האתר, הפעולה והפרוקסי שנשלחו.

הצלחה בבדיקה הזו מוכיחה שמחזור החיים המדומה של ה-SDK פועל. היא אינה מאמתת פרופיל אתר אמיתי, פרוקסי או קבלה של הטוקן ביעד. הטוקן וזהות הדפדפן המוחזרים הם ערכי בדיקה.

הוספת מקרי כשל בנקודות שבהן האינטגרציה מקבלת החלטות

הרחיבו את ה-handler המקומי כך שיחזיר את המצבים שבהם היישום שלכם צריך לטפל. השאירו את מונה ה-POST: ניסיון חוזר של תשאול לא אמור ליצור משימה נוספת.

מקרי בדיקה נוספים — אינם מכוסים בדוגמה שלעיל
מקרי בדיקה נוספים — אינם מכוסים בדוגמה שלעיל
התנהגות סביבת הבדיקהמה לבדוק
בקשת תשאול מחזירה HTTP 429, 502, 503 או 504, ולאחר מכן סטטוס מוכן.Solve מנסה שוב לאחר כשלי תשאול זמניים, מכבד את Retry-After במסגרת הזמן שהוקצב, ועדיין שולח POST אחד בלבד.
המשימה עוברת לסטטוס נכשל עם errorCode שערכו site-unreachable ועם הודעת שגיאה.טפלו ב-*solvethree.TaskFailedError והפסיקו לתשאל את המשימה הזו. השדה ErrorCode שלה מזהה את הכשל; שלפו את המשימה שנכשלה כשנדרש הטקסט שבשדה Error שלה.
היצירה מחזירה תגובת HTTP שאינה מציינת הצלחה.טפלו בשגיאת ה-HTTP במקום להתייחס לתגובה כאל משימה שנוצרה בהצלחה. השתמשו ב-errors.As כדי לחלץ את *solvethree.APIError ובדקו את StatusCode.
המשימה נשארת בהמתנה עד תום הזמן שהוקצב.זהו את context.DeadlineExceeded באמצעות errors.Is. חריגה מהזמן הקצוב מפסיקה את ההמתנה; היא אינה מבטלת עבודה מרוחקת.
השרת מתעד את היצירה, אך הלקוח מאבד את התגובה.בדקו את פרטי השחזור ב-*solvethree.Error. ‏CreateTask אינו מנסה שוב לשלוח POST באופן אוטומטי. שחזרו באמצעות GetTask כאשר TaskID ידוע, או שלחו שוב את הקלטים המקוריים המדויקים עם אותו RequestID.

במקרה של תגובה שאבדה, הגדירו לבדיקה מזהה בקשה מפורש והגדירו את סביבת הבדיקה כך שתחזיר את המשימה הקיימת כשאותו מזהה ואותם קלטים נשלחים שוב. אחרת, אתם בודקים יצירה שנייה — לא שחזור.

הפעלת המשימה הראשונה שלך.

התחילו עם $5 בקרדיט לסביבת העבודה.

יצירת סביבת עבודה
בדיקת אינטגרציית CAPTCHA ב-Go בלי לצרוך יתרה · solvethree