تكرار السؤال: …
الإجابة المختصرة
هو اختبار يتأكد من توافق واجهات الـ API بين العميل (Consumer) والمزود (Provider) دون الحاجة لتشغيل الخدمات معاً في بيئة اختبار متكاملة.
الشرح
في معمارية الـ Microservices، يؤدي كسر التوافق في الـ API إلى كوارث تشغيلية. في Contract Testing، يحدد العميل عقداً (Pact File) بالطلبات التي يتوقع إرسالها وشكل الاستجابة الدقيقة المطلوبة. يقوم المزود بتشغيل هذا العقد ضد واجهاته تلقائياً في الـ CI، مما يمنع نشر أي تعديل كاسر دون الحاجة لاختبارات E2E بطيئة ومكلفة.
مثال بالكود
import { PactV3, MatchersV3 } from "@pact-foundation/pact";
const provider = new PactV3({ consumer: "web-app", provider: "user-service" });
it("gets a user", async () => {
provider
.given("user 1 exists")
.uponReceiving("a request for user 1")
.withRequest({ method: "GET", path: "/users/1" })
.willRespondWith({
status: 200,
body: { id: MatchersV3.integer(1), fullName: MatchersV3.string("Sara") },
});
await provider.executeTest(async (mockServer) => {
const user = await getUser(mockServer.url, 1); // the real client code under test
expect(user.fullName).toBe("Sara");
});
});
// The generated pact file is published; the provider's CI verifies its real API against it.أخطاء شائعة
- استخدام Contract Testing كبديل كامل لاختبارات الوحدة للمنطق الداخلي؛ هو مخصص فقط لحدود التواصل.