تواصل معنا
Webflow Premium Partner إيهاب فايز
العودة لأدوات AI Coding
التطوير والاختبار

Pact Contract Testing

التحقق من عقود API بين المستهلكين والمزودين مع Pact، لضمان توافق الخدمات المصغرة مع تطورها.

Claude Code Codex Cursor Copilot

نظرة عامة

Pact هو إطار اختبار عقود يتحقق من التكامل بين مستهلكي ومزودي API دون الحاجة لتشغيل كلتا الخدمتين في وقت واحد. يكتب المستهلك اختباراً يُعرّف ما يتوقعه من المزود، مما يُولّد "عقد" (pact). ثم يتحقق المزود من قدرته على الوفاء بهذا العقد. يستطيع وكيل الذكاء الاصطناعي إنشاء كل من اختبارات المستهلك وإعدادات التحقق من المزود.

يمكن لوكيل الذكاء الاصطناعي كتابة اختبارات عقود مدفوعة بالمستهلك تُعرّف أزواج الطلب/الاستجابة المتوقعة، وتهيئة خادم Pact الوهمي لاختبارات المستهلك، وإعداد التحقق من المزود مع معالجات الحالة، ونشر العقود إلى Pact Broker للتنسيق مع الفريق. يفهم الوكيل نمط اختبار العقود المدفوع بالمستهلك ويمكنه تنفيذه بشكل صحيح لواجهات REST والرسائل.

Pact ضروري لبنى الخدمات المصغرة حيث تتطور الخدمات بشكل مستقل. بدلاً من تشغيل اختبارات شاملة مكلفة تتطلب تشغيل جميع الخدمات، تتحقق من العقود بشكل مستقل في خط أنابيب CI لكل خدمة. يمكن لوكيل الذكاء الاصطناعي تهيئة Pact Broker، وإعداد webhooks للتحقق المُشغّل، وتنفيذ فحص can-i-deploy قبل إصدار إصدارات جديدة.

لمن هذه الأداة؟

  • فرق الخدمات المصغرة اللي بتتحقق من توافق API من غير اختبارات شاملة
  • مطوري الـ Backend اللي بيعرّفوا حالات المزود للتحقق من العقود
  • فرق الـ Frontend اللي بتضمن إن تغييرات الـ Backend مش هتكسر توقعات API بتاعتهم
  • مهندسي المنصات اللي بيعملوا إعداد Pact Broker لإدارة العقود المركزية

التثبيت

إعداد Claude Code
npm install -D @pact-foundation/pact
Claude Code generates consumer tests and provider verifications

الإعدادات

// consumer.spec.ts
import { PactV4 } from "@pact-foundation/pact";

const provider = new PactV4({
  consumer: "frontend",
  provider: "user-service",
});

test("get user by ID", async () => {
  await provider
    .addInteraction()
    .given("user 1 exists")
    .uponReceiving("a request for user 1")
    .withRequest("GET", "/api/users/1")
    .willRespondWith(200, (b) => b.jsonBody({ id: 1, name: "Alice" }))
    .executeTest(async (mockServer) => {
      const res = await fetch(`${mockServer.url}/api/users/1`);
      expect(res.status).toBe(200);
    });
});