httpmock في Go: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

httpmock في Go: دليل شامل مع أمثلة

1. ما هي httpmock ولماذا تحتاجها؟

مكتبة httpmock للغة Go توفر أداة قوية ومرنة لمحاكاة (Mocking) طلبات واستجابات HTTP في الاختبارات. في تطوير البرمجيات الحديث، يعد التفاعل مع واجهات API الخارجية وخدمات الويب والخدمات المصغرة جزءًا أساسيًا. لكن اختبار الكود الذي يتصل مباشرة بهذه الموارد الخارجية يواجه عدة مشاكل: الاعتماد على توفر الشبكة، بطء تنفيذ الاختبارات، عدم predictability لاستجابات الخوادم الحقيقية، واستحالة إعادة إنتاج الحالات الحدودية (مثل انتهاء المهلة أو رموز أخطاء محددة). تحل httpmock هذه المشكلات بالسماح للمطورين باعتراض طلبات HTTP على مستوى النقل في Go وإرجاع استجابات محددة مسبقًا، مما يعزل الكود المختبر تمامًا عن العالم الخارجي.

الهدف الرئيسي لـ httpmock هو جعل اختبارات الوحدات (Unit Tests) واختبارات التكامل (Integration Tests) المتعلقة بعملاء HTTP سريعة وموثوقة ومحددة النتائج. بدلاً من إرسال طلبات حقيقية عبر الإنترنت، تستبدل المكتبة الناقل HTTP القياسي في Go (http.RoundTripper) بناقل خاص بها يطابق الطلبات الواردة مع مجموعة من "النماذج الوهمية" (Stubs) المسجلة. يحدد كل نموذج وهمي الشروط التي يجب أن يستوفيها الطلب (الطريقة، URL، الترويسات، المحتوى) والاستجابة التي يجب إرجاعها. يتيح ذلك اختبار منطق معالجة الاستجابات، وإعادة المحاولات، ومعالجة الأخطاء، وجوانب أخرى دون الحاجة إلى تشغيل خوادم حقيقية.

تكون httpmock مفيدة بشكل خاص في السيناريوهات التالية: اختبار عملاء REST API، اختبار الخدمات التي تجمع البيانات من عدة مصادر خارجية، اختبار معالجات Webhook، وأثناء التطوير في ظل اتصال إنترنت محدود أو غير مستقر. بفضل بساطتها وتكاملها مع حزمة net/http، تعتبر httpmock المعيار الفعلي لمحاكاة HTTP في مجتمع Go.

2. التثبيت

يتم تثبيت httpmock بالطريقة القياسية في Go باستخدام الأمر go get. تأكد من أن لديك Go الإصدار 1.11 أو أعلى (لدعم الوحدات).

go get github.com/jarcoal/httpmock

بعد تنفيذ هذا الأمر، ستتم إضافة المكتبة إلى ملف go.mod الخاص بك. للتحديث إلى أحدث إصدار، استخدم:

go get -u github.com/jarcoal/httpmock

يمكنك الآن استيراد المكتبة في ملفات الاختبار الخاصة بك:

import "github.com/jarcoal/httpmock"

3. البداية السريعة — مثال عملي بسيط

لنقم بإنشاء اختبار بسيط يتحقق من دالة تقوم بطلب GET لواجهة API خارجية وتعيد محتوى الاستجابة. سنقوم بمحاكاة هذا الطلب بحيث يتم تنفيذ الاختبار دون اتصال حقيقي بالشبكة.

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

// FetchData تقوم بطلب GET إلى URL المحدد وتعيد محتوى الاستجابة.
func FetchData(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }
    return string(body), nil
}

func main() {
    // هذا مجرد عرض توضيحي، في الواقع سيتم استدعاء الدالة من الاختبارات.
    data, err := FetchData("https://api.example.com/data")
    if err != nil {
        fmt.Println("خطأ:", err)
        return
    }
    fmt.Println("البيانات:", data)
}

الآن لنكتب اختبارًا باستخدام httpmock:

package main

import (
    "testing"
    "github.com/jarcoal/httpmock"
)

func TestFetchData(t *testing.T) {
    // 1. تفعيل المحاكاة                    

توصيات