اختبار تكامل CAPTCHA بلغة Go دون استهلاك الرصيد
وجّه حزمة SDK الرسمية لـ Go إلى خادم httptest باستخدام NewClientWithBaseURL. يوفّر الخادم استجابات المهام، لتتمكن من اختبار سلوك الحزمة دون استهلاك رصيد solvethree أو تقديم أسرار التطبيق.
في هذه الصفحة
تشغيل حزمة SDK باستخدام بيئة اختبار محلية
- 1.
ثبّت الاعتمادية
استخدم Go 1.22 أو أحدث. داخل وحدة Go لديك، استخدم
go getلتثبيتsolvethree.com/[email protected]. تُقدَّم الوحدة من solvethree.com. - 2.
حفظ الاختبار وتشغيله
احفظ المثال باسم
captcha_integration_test.goفي دليل مخصص للاختبارات فقط داخل وحدتك، ثم شغّلgo testمن ذلك الدليل. أبقِ مفتاح بيئة الاختبار واسم المضيف والوكيل دون تغيير: فهي بيانات اختبار، وليست بيانات اعتماد أو خدمات تحتاج إلى إعدادها.
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 عبر عنوان الاسترجاع للاختبارات. هنا، يحل server.URL محل عنوان API الخاص بالإنتاج، ويستجيب المعالج محليًا. قيمة الوكيل ليست سوى جزء من المهمة المرسلة؛ ولا تتصل بها بيئة الاختبار هذه.
ما الذي يثبته نجاح الاختبار
تترك استجابة POST المهمة قيد الانتظار. ويتلقى طلب لاحق استجابة جاهزة تحتوي على FIXTURE_TOKEN. يتحقق التأكيد النهائي من الرمز المُعاد ومن إرسال طلب POST واحد بالضبط، لكشف أي إنشاء عرضي لمهمة إضافية أثناء هذا التدفق.
أُبقي المعالج بسيطًا عمدًا: يحصل كل طلب غير POST على الاستجابة الجاهزة. وهو لا يتحقق من طريقة الاستطلاع أو مسار الطلب أو JSON المرسل. لاختبار عقد الطلب أيضًا، اجعل المعالج يتحقق من مسارات الإنشاء واسترجاع المهمة المتوقعة، إلى جانب الموقع والإجراء والوكيل المرسلة.
يثبت نجاح هذا الاختبار أن دورة حياة حزمة SDK المُحاكاة تعمل. لكنه لا يتحقق من صحة ملف تعريف موقع حقيقي أو وكيل، ولا من قبول الهدف للرمز. الرمز المُعاد وهوية المتصفح قيم خاصة ببيئة الاختبار.
أضف حالات فشل عند نقاط اتخاذ القرار في تكاملك
وسّع المعالج المحلي ليعيد الحالات التي يجب على تطبيقك التعامل معها. احتفظ بعدّاد 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 نفسه. |
في حالة فقدان الاستجابة، امنح الاختبار معرّف طلب صريحًا واجعل بيئة الاختبار تعيد المهمة الموجودة عند إعادة إرسال ذلك المعرّف والمدخلات نفسها. وإلا، فأنت تختبر عملية إنشاء ثانية، لا استردادًا.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.