تست قرارداد مبتنی بر مصرف کننده با پیمان – اصول اولیه

Summarize this content to 400 words in Persian Lang
تست قرارداد چیست؟
تست قرارداد توسط مارتین فاولر ابداع شده است و او یک مقاله عالی در مورد bliki خود دارد که نحوه عملکرد آن را توضیح می دهد.
توصیه میکنم اگر نمیدانید تست قرارداد چیست یا چه کاربردی دارد، ابتدا آن مقاله را بخوانید.
این مقاله نحوه عملکرد آن را شرح نمی دهد. در عوض سعی میکند توضیحی عملی گام به گام در مورد نحوه عملکرد Pact و PactFlow باشد. در پایان پیوندی به برخی از کدها برای مثال کاربردی تر وجود خواهد داشت.
امیدواریم با خواندن این مقاله به جای مستندات، درک نحوه عملکرد Pact و PactFlow آسانتر و سریعتر باشد، اما اگر واقعاً میخواهید عمیقتر شوید، اسناد رسمی هنوز بهترین مکان برای رفتن است.
آزمایش Pact and Pact CDC چیست؟
Pact یک ابزار تست قرارداد متن باز است.
تست قرارداد مبتنی بر مصرف کننده (CDC) یکی از روش هایی است که پکت آزمایش قرارداد را اجرا می کند.
در اصل دو مرحله عمده دارد:
ابتدا تعریف قرارداد، اعتبار سنجی و تولید در مصرف کننده، و
اعتبار قرارداد نهایی در ارائه دهنده.
چگونه کار می کند؟
هدف Pact CDC این است که انتظارات مصرف کننده از خدمات ارائه شده را به آنچه “پیمان” نامیده می شود، تبدیل کند، که اساساً قراردادی است که با کد نوشته شده است.
قرارداد شامل تعاملات است.
فعل و انفعالات روشی اعلامی برای رمزگذاری پیامها (درخواستها و پاسخها) است که بین یک مصرفکننده و یک ارائهدهنده برای یک هدف خاص مبادله میشود، به عنوان مثال برای یک ارائهدهنده خدمات محصول برای ایجاد محصول.
آزمایش CDC از مصرف کننده شروع می شود.
در تستهای واحدی به نام تستهای پیمان مصرفکننده، مصرفکننده تعاملات را اعلام میکند و آنها را به یک مدل ساختگی ارائهدهنده از Pact، ارائهدهنده Pact Mock اضافه میکند.
تعاملات حاوی اطلاعاتی مانند:
درخواست بار، قالب، روش (به عنوان مثال، GET)، مسیر (به عنوان مثال، /users)، سرصفحه ها، کوکی ها و غیره،
بار پاسخ، قالب، کد پاسخ، هدر و غیره
برای API های HTTP، تعاملات معمولی شامل کدهای پاسخ معمولی است: 201 برای ایجاد منابع جدید، 200 برای واکشی منابع موجود، 400 برای درخواست های بد قالب، 404 برای منابع موجود، 500 برای خطاهای مختلف و غیره.
مثال عملی
بیایید فرض کنیم قراردادی بین یک برنامه React، که مصرف کننده است، و یک API HTTP، که ارائه دهنده است، داریم.
به طور معمول، برنامه React دارای تست واحد برای تعامل با ارائه دهندگان خود است. این آزمایشها نوعی کلاس ارائهدهنده API (یا کلاس خدمات)، یا توابع یا قلابهای واکشی دادههای فردی یا قلابهای جستجوی TanStack Query و قلابهای جهش را تأیید میکنند.
این واحدهای کد به منظور از بین بردن پیچیدگیهای برخورد با شبکه، فراخوانی سرویس بالادستی، رسیدگی به خطاها و نگاشت پاسخهای خام به انواعی است که برنامه کاربردی میفهمد و استفاده میکند. آنها معمولاً از چیزی مانند Mock Service Worker (MSW) برای تمسخر پاسخهایی که API بالادستی برمیگرداند استفاده میکنند و آزمایش میکنند که کد میتواند به درستی آن پاسخها را مدیریت کند (که معمولاً به معنای انجام نقشهبرداری دادهها، اعتبارسنجی طرحواره دادههای deserialized، مدیریت خطا، و غیره.).
اما، همانطور که می توانید بگویید، این یک ادغام موفق را تضمین نمی کند. در تولید، میتوان نسخه متفاوتی از ارائهدهنده را به کار برد که به همان روشی که در تستهای واحد مورد تمسخر قرار گرفته بود، پاسخ نمیدهد. برای اطلاع از اینکه تست قرارداد این مشکل را برطرف می کند، ادامه دهید.
با تست های Pact Consumer، Pact به جای اینکه توسعه دهنده مجبور به نوشتن آن باشد، بخش MSW را تولید می کند. Pact با استفاده از تعاملات اعلام شده، به طور موثر یک تقلید از ارائه دهنده به نام ارائه دهنده Pact Mock تولید می کند.
بنابراین یک آزمون واحد قبلی مانند CustomerService.spec.ts تبدیل می شود CustomerServiceContract.spec.ts یا CustomerService.pact.spec.ts، برای نشان دادن اینکه از آزمایش پیمان و قرارداد استفاده می شود. تست های واحد تا حد زیادی یکسان باقی می مانند، با این تفاوت که Pact از تمسخر MSW مراقبت می کند و تماس های شبکه را رهگیری می کند.
در صورت موفقیت آمیز بودن تست ها، Pact فایل های پیمان حاوی تعریف تعاملات را تولید می کند. به هر حال دلیلی وجود ندارد که فایل های پیمان را قبل از تأیید اعتبار طرف مصرف کننده در آزمایش Pact CDC ایجاد کنید.
اگرچه تولید فایلهای پیمان به این معنی است که مصرفکننده طرف قرارداد خود را تأیید کرده است (یا اینکه مصرفکننده قرارداد را تأیید کرده است، بستگی به نحوه نگاه شما به آن دارد)، در شرایط پیمان، این قرارداد هنوز یک قرارداد معتبر نیست، تا زمانی که ارائهدهنده نیز آن را تایید می کند.
تست قرارداد در مورد اعتبار بخشیدن به تعاملات بین یک مصرف کننده و یک ارائه دهنده است، و به طور خاص، در مورد این است که بگوییم کدام نسخه از یک مصرف کننده و یک ارائه دهنده به یک قرارداد احترام می گذارند و می توانند با خیال راحت با هم مستقر شوند.
بدیهی است که اکنون این قرارداد نیز باید توسط ارائهدهنده تأیید شود، به این معنی که با توجه به تعاملات یکسان، ارائهدهنده باید بتواند همان درخواستها را رسیدگی کند و همان پاسخهای مورد انتظاری را ارسال کند که ارائهدهنده ساختگی قبلاً در آزمایشهای واحد مصرفکننده ارسال کرده است. ارائه دهنده واقعی
پیمان همچنین به تسهیل این امر کمک می کند. فایل های پیمان را می گیرد و باعث تمسخر مصرف کننده می شود. ارائه دهنده از آن در تست های واحد برای تایید قرارداد از دیدگاه ارائه دهنده استفاده می کند.
اما قبل از اینکه توضیح دهم که چگونه کار می کند، ابتدا باید PactFlow را توضیح دهم، زیرا نقش اصلی را در هماهنگ کردن همه چیزهایی که تاکنون توضیح داده ام ایفا می کند.
PactFlow
برای هماهنگ کردن همه چیزهایی که برای آزمایش و اعتبار قرارداد و همچنین استقرار در تولید لازم است، باید یک کارگزار پیمان داشته باشید. PactFlow پرکاربردترین کارگزار پیمان به عنوان سرویس است.
تنظیمات معمولی PactFlow را در خط لوله CI ادغام می کنند:
هر زمان که یک مصرف کننده تغییری را اعمال می کند و CI را تحریک می کند، آنچه معمولاً اتفاق می افتد این است:
CI تست های واحد، از جمله تست های پیمان مصرف کننده را اجرا می کند.
اگر تست های مصرف کننده قبول شوند، فایل های پیمان حاوی قراردادها را تولید می کنند.
CI فایلهای پیمان و نتایج آزمایش را در PactFlow آپلود میکند، جایی که آنها نسخهسازی میشوند.
به طور مشابه، اگر یک ارائهدهنده CI را راهاندازی کند، آنچه معمولاً اتفاق میافتد این است:
CI آزمایشهای واحد را اجرا میکند، از جمله آزمایشهای تأیید ارائهدهنده که همه پیمانهای مربوط به ارائهدهنده را دانلود میکند و تأیید میکند که ارائهدهنده به آن قراردادها احترام میگذارد.
آزمایشهای تأیید ارائهدهنده از تأییدکنندهای استفاده میکنند که از Pact میآید که به کارگزار میگوید کدام پیمانها تأیید شدهاند و کدامها اعتبار ندارند.
کارگزار جفت مصرفکننده-ارائهدهنده و قراردادشان را برای استقرار معتبر یا غیر معتبر علامتگذاری میکند.
دادههای نسخهسازیشده ذخیرهشده در PactFlow همراه با وضعیت استقرار فعلی سیستم میتواند به ما بگوید که آیا نسخه جدیدی از یک مصرفکننده را میتوان در کنار یک ارائهدهنده مستقر موجود در تولید مستقر کرد، یا میتواند به ما بگوید که آیا آخرین نسخههای یک مصرفکننده و ارائهدهنده میتواند به طور همزمان با هم مستقر می شوند و غیره
به طور خلاصه، وضعیت فعلی استقرار سیستم و آخرین اطلاعات آزمایش قرارداد را می توان کاهش داد و با هم متفاوت کرد تا به ما بگوید که کدام یک از آخرین نسخه های مصنوعات مختلف را می توان به طور ایمن مستقر کرد.
PactFlow این کار را از طریق یک ابزار داخلی به نام can-i-deploy انجام می دهد. این آخرین مرحله قبل از استقرار است و به عنوان دروازه ایمنی استقرار عمل می کند.
مثال عملی (ادامه)
همانطور که قبلاً ذکر کردم که مجبور شدم PactFlow را توضیح دهم، این پیمان نیز باید توسط ارائه دهنده تأیید شود.
آزمایش Pact CDC از طرف ارائه دهنده بسیار ساده تر است (عمدتاً به این دلیل که نیازی به اعلام هیچ تعاملی نیست، فقط آزمایش شده است).
ارائهدهنده همچنین باید یک تست واحد به نام تست تأیید ارائهدهنده بنویسد تا هر تعامل را تأیید کند، اما Pact یک کمک تأییدکننده در اینجا ارائه میکند که بیشتر کار را انجام میدهد: پیمانها را از کارگزار دانلود میکند و درخواستهای مصرفکننده اعلامشده را دوباره پخش میکند و ارسال میکند. آنها را به ارائه دهنده ای که در لوکال هاست گوش می دهد. تمام آزمایشهای ارائهدهنده باید انجام دهند این است که ارائهدهنده را برای گوش دادن به آن درخواستها و پاسخ به آنها تنظیم کنند.
تأییدکننده پیمان بررسی میکند که آیا ارائهدهنده با پاسخ مورد انتظار همانطور که در تعامل اعلام شده است، پاسخ میدهد یا خیر، و آن را به کارگزار پیمان ارسال میکند.
و این اساساً پایان آزمایش و اعتبار قرارداد است.
برای مثال کد عملی به مقاله دیگر من مراجعه کنید.
خلاصه و فواید
تیم های مصرف کننده می توانند قراردادهای پیمان را مستقل از تیم های ارائه دهنده ایجاد و حفظ کنند. این به مصرفکنندگان اجازه میدهد تا نیازها و انتظارات خود را بدون اتکا به جزئیات پیادهسازی ارائهدهنده تعریف کنند.
آزمایشات قرارداد پیمان معمولاً در خطوط لوله یکپارچه سازی پیوسته (CI) مصرف کنندگان و ارائه دهندگان ادغام می شوند. هرگاه تغییراتی در هر دو طرف ایجاد شود، آزمایشها بهطور خودکار اجرا میشوند تا اطمینان حاصل شود که قراردادها همچنان در یک راستا هستند و یکپارچگی یکپارچه و تحویل مداوم را تسهیل میکند.
تست قرارداد چیست؟
تست قرارداد توسط مارتین فاولر ابداع شده است و او یک مقاله عالی در مورد bliki خود دارد که نحوه عملکرد آن را توضیح می دهد.
توصیه میکنم اگر نمیدانید تست قرارداد چیست یا چه کاربردی دارد، ابتدا آن مقاله را بخوانید.
این مقاله نحوه عملکرد آن را شرح نمی دهد. در عوض سعی میکند توضیحی عملی گام به گام در مورد نحوه عملکرد Pact و PactFlow باشد. در پایان پیوندی به برخی از کدها برای مثال کاربردی تر وجود خواهد داشت.
امیدواریم با خواندن این مقاله به جای مستندات، درک نحوه عملکرد Pact و PactFlow آسانتر و سریعتر باشد، اما اگر واقعاً میخواهید عمیقتر شوید، اسناد رسمی هنوز بهترین مکان برای رفتن است.
آزمایش Pact and Pact CDC چیست؟
Pact یک ابزار تست قرارداد متن باز است.
تست قرارداد مبتنی بر مصرف کننده (CDC) یکی از روش هایی است که پکت آزمایش قرارداد را اجرا می کند.
در اصل دو مرحله عمده دارد:
- ابتدا تعریف قرارداد، اعتبار سنجی و تولید در مصرف کننده، و
- اعتبار قرارداد نهایی در ارائه دهنده.
چگونه کار می کند؟
هدف Pact CDC این است که انتظارات مصرف کننده از خدمات ارائه شده را به آنچه “پیمان” نامیده می شود، تبدیل کند، که اساساً قراردادی است که با کد نوشته شده است.
قرارداد شامل تعاملات است.
فعل و انفعالات روشی اعلامی برای رمزگذاری پیامها (درخواستها و پاسخها) است که بین یک مصرفکننده و یک ارائهدهنده برای یک هدف خاص مبادله میشود، به عنوان مثال برای یک ارائهدهنده خدمات محصول برای ایجاد محصول.
آزمایش CDC از مصرف کننده شروع می شود.
در تستهای واحدی به نام تستهای پیمان مصرفکننده، مصرفکننده تعاملات را اعلام میکند و آنها را به یک مدل ساختگی ارائهدهنده از Pact، ارائهدهنده Pact Mock اضافه میکند.
تعاملات حاوی اطلاعاتی مانند:
- درخواست بار، قالب، روش (به عنوان مثال،
GET
)، مسیر (به عنوان مثال،/users
)، سرصفحه ها، کوکی ها و غیره، - بار پاسخ، قالب، کد پاسخ، هدر و غیره
برای API های HTTP، تعاملات معمولی شامل کدهای پاسخ معمولی است: 201 برای ایجاد منابع جدید، 200 برای واکشی منابع موجود، 400 برای درخواست های بد قالب، 404 برای منابع موجود، 500 برای خطاهای مختلف و غیره.
مثال عملی
بیایید فرض کنیم قراردادی بین یک برنامه React، که مصرف کننده است، و یک API HTTP، که ارائه دهنده است، داریم.
به طور معمول، برنامه React دارای تست واحد برای تعامل با ارائه دهندگان خود است. این آزمایشها نوعی کلاس ارائهدهنده API (یا کلاس خدمات)، یا توابع یا قلابهای واکشی دادههای فردی یا قلابهای جستجوی TanStack Query و قلابهای جهش را تأیید میکنند.
این واحدهای کد به منظور از بین بردن پیچیدگیهای برخورد با شبکه، فراخوانی سرویس بالادستی، رسیدگی به خطاها و نگاشت پاسخهای خام به انواعی است که برنامه کاربردی میفهمد و استفاده میکند. آنها معمولاً از چیزی مانند Mock Service Worker (MSW) برای تمسخر پاسخهایی که API بالادستی برمیگرداند استفاده میکنند و آزمایش میکنند که کد میتواند به درستی آن پاسخها را مدیریت کند (که معمولاً به معنای انجام نقشهبرداری دادهها، اعتبارسنجی طرحواره دادههای deserialized، مدیریت خطا، و غیره.).
اما، همانطور که می توانید بگویید، این یک ادغام موفق را تضمین نمی کند. در تولید، میتوان نسخه متفاوتی از ارائهدهنده را به کار برد که به همان روشی که در تستهای واحد مورد تمسخر قرار گرفته بود، پاسخ نمیدهد. برای اطلاع از اینکه تست قرارداد این مشکل را برطرف می کند، ادامه دهید.
با تست های Pact Consumer، Pact به جای اینکه توسعه دهنده مجبور به نوشتن آن باشد، بخش MSW را تولید می کند. Pact با استفاده از تعاملات اعلام شده، به طور موثر یک تقلید از ارائه دهنده به نام ارائه دهنده Pact Mock تولید می کند.
بنابراین یک آزمون واحد قبلی مانند CustomerService.spec.ts
تبدیل می شود CustomerServiceContract.spec.ts
یا CustomerService.pact.spec.ts
، برای نشان دادن اینکه از آزمایش پیمان و قرارداد استفاده می شود. تست های واحد تا حد زیادی یکسان باقی می مانند، با این تفاوت که Pact از تمسخر MSW مراقبت می کند و تماس های شبکه را رهگیری می کند.
در صورت موفقیت آمیز بودن تست ها، Pact فایل های پیمان حاوی تعریف تعاملات را تولید می کند. به هر حال دلیلی وجود ندارد که فایل های پیمان را قبل از تأیید اعتبار طرف مصرف کننده در آزمایش Pact CDC ایجاد کنید.
اگرچه تولید فایلهای پیمان به این معنی است که مصرفکننده طرف قرارداد خود را تأیید کرده است (یا اینکه مصرفکننده قرارداد را تأیید کرده است، بستگی به نحوه نگاه شما به آن دارد)، در شرایط پیمان، این قرارداد هنوز یک قرارداد معتبر نیست، تا زمانی که ارائهدهنده نیز آن را تایید می کند.
تست قرارداد در مورد اعتبار بخشیدن به تعاملات بین یک مصرف کننده و یک ارائه دهنده است، و به طور خاص، در مورد این است که بگوییم کدام نسخه از یک مصرف کننده و یک ارائه دهنده به یک قرارداد احترام می گذارند و می توانند با خیال راحت با هم مستقر شوند.
بدیهی است که اکنون این قرارداد نیز باید توسط ارائهدهنده تأیید شود، به این معنی که با توجه به تعاملات یکسان، ارائهدهنده باید بتواند همان درخواستها را رسیدگی کند و همان پاسخهای مورد انتظاری را ارسال کند که ارائهدهنده ساختگی قبلاً در آزمایشهای واحد مصرفکننده ارسال کرده است. ارائه دهنده واقعی
پیمان همچنین به تسهیل این امر کمک می کند. فایل های پیمان را می گیرد و باعث تمسخر مصرف کننده می شود. ارائه دهنده از آن در تست های واحد برای تایید قرارداد از دیدگاه ارائه دهنده استفاده می کند.
اما قبل از اینکه توضیح دهم که چگونه کار می کند، ابتدا باید PactFlow را توضیح دهم، زیرا نقش اصلی را در هماهنگ کردن همه چیزهایی که تاکنون توضیح داده ام ایفا می کند.
PactFlow
برای هماهنگ کردن همه چیزهایی که برای آزمایش و اعتبار قرارداد و همچنین استقرار در تولید لازم است، باید یک کارگزار پیمان داشته باشید. PactFlow پرکاربردترین کارگزار پیمان به عنوان سرویس است.
تنظیمات معمولی PactFlow را در خط لوله CI ادغام می کنند:
هر زمان که یک مصرف کننده تغییری را اعمال می کند و CI را تحریک می کند، آنچه معمولاً اتفاق می افتد این است:
- CI تست های واحد، از جمله تست های پیمان مصرف کننده را اجرا می کند.
- اگر تست های مصرف کننده قبول شوند، فایل های پیمان حاوی قراردادها را تولید می کنند.
- CI فایلهای پیمان و نتایج آزمایش را در PactFlow آپلود میکند، جایی که آنها نسخهسازی میشوند.
به طور مشابه، اگر یک ارائهدهنده CI را راهاندازی کند، آنچه معمولاً اتفاق میافتد این است:
- CI آزمایشهای واحد را اجرا میکند، از جمله آزمایشهای تأیید ارائهدهنده که همه پیمانهای مربوط به ارائهدهنده را دانلود میکند و تأیید میکند که ارائهدهنده به آن قراردادها احترام میگذارد.
- آزمایشهای تأیید ارائهدهنده از تأییدکنندهای استفاده میکنند که از Pact میآید که به کارگزار میگوید کدام پیمانها تأیید شدهاند و کدامها اعتبار ندارند.
- کارگزار جفت مصرفکننده-ارائهدهنده و قراردادشان را برای استقرار معتبر یا غیر معتبر علامتگذاری میکند.
دادههای نسخهسازیشده ذخیرهشده در PactFlow همراه با وضعیت استقرار فعلی سیستم میتواند به ما بگوید که آیا نسخه جدیدی از یک مصرفکننده را میتوان در کنار یک ارائهدهنده مستقر موجود در تولید مستقر کرد، یا میتواند به ما بگوید که آیا آخرین نسخههای یک مصرفکننده و ارائهدهنده میتواند به طور همزمان با هم مستقر می شوند و غیره
به طور خلاصه، وضعیت فعلی استقرار سیستم و آخرین اطلاعات آزمایش قرارداد را می توان کاهش داد و با هم متفاوت کرد تا به ما بگوید که کدام یک از آخرین نسخه های مصنوعات مختلف را می توان به طور ایمن مستقر کرد.
PactFlow این کار را از طریق یک ابزار داخلی به نام can-i-deploy انجام می دهد. این آخرین مرحله قبل از استقرار است و به عنوان دروازه ایمنی استقرار عمل می کند.
مثال عملی (ادامه)
همانطور که قبلاً ذکر کردم که مجبور شدم PactFlow را توضیح دهم، این پیمان نیز باید توسط ارائه دهنده تأیید شود.
آزمایش Pact CDC از طرف ارائه دهنده بسیار ساده تر است (عمدتاً به این دلیل که نیازی به اعلام هیچ تعاملی نیست، فقط آزمایش شده است).
ارائهدهنده همچنین باید یک تست واحد به نام تست تأیید ارائهدهنده بنویسد تا هر تعامل را تأیید کند، اما Pact یک کمک تأییدکننده در اینجا ارائه میکند که بیشتر کار را انجام میدهد: پیمانها را از کارگزار دانلود میکند و درخواستهای مصرفکننده اعلامشده را دوباره پخش میکند و ارسال میکند. آنها را به ارائه دهنده ای که در لوکال هاست گوش می دهد. تمام آزمایشهای ارائهدهنده باید انجام دهند این است که ارائهدهنده را برای گوش دادن به آن درخواستها و پاسخ به آنها تنظیم کنند.
تأییدکننده پیمان بررسی میکند که آیا ارائهدهنده با پاسخ مورد انتظار همانطور که در تعامل اعلام شده است، پاسخ میدهد یا خیر، و آن را به کارگزار پیمان ارسال میکند.
و این اساساً پایان آزمایش و اعتبار قرارداد است.
برای مثال کد عملی به مقاله دیگر من مراجعه کنید.
خلاصه و فواید
تیم های مصرف کننده می توانند قراردادهای پیمان را مستقل از تیم های ارائه دهنده ایجاد و حفظ کنند. این به مصرفکنندگان اجازه میدهد تا نیازها و انتظارات خود را بدون اتکا به جزئیات پیادهسازی ارائهدهنده تعریف کنند.
آزمایشات قرارداد پیمان معمولاً در خطوط لوله یکپارچه سازی پیوسته (CI) مصرف کنندگان و ارائه دهندگان ادغام می شوند. هرگاه تغییراتی در هر دو طرف ایجاد شود، آزمایشها بهطور خودکار اجرا میشوند تا اطمینان حاصل شود که قراردادها همچنان در یک راستا هستند و یکپارچگی یکپارچه و تحویل مداوم را تسهیل میکند.