احمد رفیعی
احمد رفیعی
خواندن ۱۱ دقیقه·۵ ماه پیش

تست نوشتن و شروع مسیر CI/CD (قسمت اول)

توی این پست یه مقدار در مورد تست نوشتن و اهمیت اون توضیح میدم و بعدش انواع تست رو بهتون معرفی میکنم و برای آغاز مطلب CI/CD در ادامه‌ی مسیر دواپس‌مون، میریم سراغ معرفی اولیه مفاهیم CI/CD و نهایتا دو تا از ابزارهای مهم‌ش رو با هم مقایسه میکنم.

خب یه مروری کنیم پست‌های قبلی رو:

توصیه می‌کنم که حتما این پست‌ها رو هم مطالعه کنید. بریم که ادامه بدیم.

Software Testing
Software Testing

تست نرم‌افزار و ضرورت اون:

تست مهمه چون احتمالش هست که باگ یا ارور توی کد باشه که با تست بتونیم اونو متوجه بشیم قبل از اینکه مشتری مون توی پروداکشن متوجه اش بشه و بهمون بگه. معمولا نرم افزار هایی که تست شدن بیشتر قابل اتکا هستن، امن تر هستن، کارایی بیشتری دارن و رضایت مشتری بالاتری رو دارن.

تست ها رو به دو نوع Functional که توی اونها معمولا صحت کارکرد یک یا چند سرویس رو به لحاظ لاجیکی بررسی می‌کنیم و Non-Functional که توی اونها سرویس‌ها رو به لحاظ عملکردی در شرایط مختلف تست می‌کنیم، تقسیم میشن.

Test Benefits
Test Benefits

چرا تست اتومیشن داشته باشیم؟

چون میتونیم تست اتومیت رو توی CI/CD به راحتی انجام بدیم که بهمون توی ذخیره زمان و هزینه کمک میکنه و دیباگ‌مون رو سریعتر میکنه. بهمون امکان استفاده مجدد از تست رو میده و دقتمون رو بالاتر میبره و سریعتر بازخورد نسبت به کدمون رو میتونیم از چرخه CI/CD بگیریم.

Test types
Test types

انواع تست:

  • Unit Testing​

تو یونیت تست یک ماژول از اپلیکیشن یا یک میکروسرویس رو به تنهایی تست میکنیم تا مطمئن بشیم به شکلی که انتظار داریم کار میکنه.

  • Integration Testing​

بعد اینکه توی یونیت تست فهمیدیم هر سرویس به تنهایی داره درست کار میکنه حالا توی اینتگریشن تست، سعی می‌کنیم بررسی کنیم که آیا سرویس‌ها در ارتباط با همدیگه هم به درستی کار می‌کنند.

  • Functional Testing

توی این تست فانکشنالیتی یه تابع رو به همراه دیپندنسی‌های مورد نیازش که باهاشون ارتباط داره، توی سیستم آزمایش می‌کنیم. مثلا اینکه آیا فرآیند درگاه پرداخت بدرستی کار میکنه توی یک سایت فروشگاه اینترنتی، میشه تست فانکشنال.

  • UAT (User Acceptance Testing)​

این نوع تست برای این هست که ببینیم آیا سیستم نرم‌افزاری ما نیازمندی و انتظارات کاربران یا سهامداران را برآورده میکند یا نه. معمولا این تست توسط کاربران نهایی یا گروهی تعیین شده انجام می‌شود. دقت کنید که این کاربر نهایی یه گروه مشخص قبل تعیین شده هست معمولا که صرفا شبیه سازی میکنه رفتار کاربر در محیط واقعی رو.

  • Smoke Testing

فرض کنید داریم دودکش یه خونه ای رو درست می‌کنیم برای اینکه ببینیم درست کار میکنه یه سیگار زیرش می‌کشیم ببینیم دود میره بالا یا نه 🙂 البته شما مراقب سلامتیتون باشید و سیگار نکشید.

یا مثلا قبل وصل کردن لوله بخاری یه کاغذ آتیش میزنیم می‌گیریم جلو دودکش ببینیم خاموش میشه یا شعله رو میکشه بالا.

حالا از فلسفه اسمش که بگذریم 🙂 اسموک تست، نوعی تست پایه ای هست که به ما کمک میکنه عملکردهای حیاتی سیستم رو سریع ارزیابی کنیم و مشکلات اصلی و بزرگ رو در زمان توسعه و تست متوجه شون بشیم.

( اصلاحیه ۲ مرداد ۱۴۰۳ : یکی از دوستان که پست رو خونده بود لطف کرد بهمون بازخورد داد که : فلسفه Smoke Test از تست سخت‌افزارهای الکترونیکی میاد که یک بورد الکترویکی رو متصل میکنند و اگه با جریان نیروی الکتریکی ازش دود خارج شد یعنی مشکل داره و دیگه سراغ چیزهای اضافه نمیرن. دمش گرم مرسی که با دقت مطالب رو دنبال می‌کنید.)

  • Performance​

تو پرفورمنس تست ارزیابی می‌کنیم که سیستم نرم‌افزاری ما توی شرایط مختلف به لحاظ کارایی چطور عمل میکند. فاکتور هایی مثل منابع مصرفی، ثبات، قابلیت اسکیل کردن و پاسخگویی رو ارزیابی می‌کنیم تا مطمئن بشیم سیستم ما میتونه لود مورد انتظارمون رو هندل کنه.

  • Load​ Test

اگه از شما بخوان که یه سیستم رو تیون کنید، چطوری متوجه میشید که این اپلیکیشن نیازمندی اصلیش RAM هست یا CPU یا IOPS؟ توی لود تست ما اپلیکیشن‌مون رو میبریم زیر لود تا متوجه بشیم کجاش درد میکنه 🙂 که بعدش بتونیم به درمانش کمک کنیم.

  • ​Scalability

توی این تست بررسی می‌کنیم که اپلیکیشن مون به خوبی میتونه توی شرایطی که نیاز بود خودش رو بزرگتر کنه و اگه درخواست ها زیاد شد میتونه هندل کنه با اسکیل کردن خودش؟ مثلا یه جشنواره گذاشتیم یا توی عید مثلا قراره یکدفعه حجم درخواست‌هایی که سمتمون میاد زیاد بشه.

  • Volume

توی والیوم تستینگ هم لود می‌ندازیم روی سیستم، کلا والیوم تست و لود تست و اسکیلیبیلیتی تست شبیه هم هستن توی همه شون لود میریزیم روی سیستم، تفاوت توی مقدار لودی هست که میریزیم. تا جایی که هندل میکنه لود بریزیم؟ یا تا جایی که میمیره؟

حالا توی والیوم تست هم دنبال ارزیابی عملکرد سیستم زیر لود یا یک والیوم از دیتا هستیم. هدف اینه که مطمئن شیم سیستم میتونه اون والیوم دیتا یا اون حجم از تراکنش یا اون حجم از فعالیت کاربر رو بدون افت کیفیت یا خطا هندل کنه.

  • Security

توی سکیوریتی به بررسی معیارهای امنیتی و آسیب پذیری‌های سیستم می‌پردازیم. هدف‌مون توی این تست این هست که ریسک‌های امنیتی رو مشخص کنیم مثلا مطمئن شیم که جایی بدون اینکه آتورایز کنیم دسترسی نداده باشیم یا مثلا دیتامون لیک نشده باشه یا آسیب پذیری‌های شناخته شده دیگه.

  • Stress

استرس تست هم مثل تست هایی که لود می‌ریختیم هست و هدف ما توی این تست اینه که محدودیت ها و لیمیت‌های سیستم مون رو شناسایی کنیم و ببینیم چقدر لود میتونه تحمل کنه یا ریسورس‌هامون چقدر کشش دارند. پس یه جورایی توی استرس تست انقدر لود می‌ریزیم تا بمیره 🙂

  • End to End testing

توی اندتواند تست دنبال این هستیم که کارکرد سیستم‌مون رو از صفر تا صد به شکل کامل بررسی کنیم. مثلا از اول که کاربر میاد و ثبت نام میکنه تا لاگین کردنش و انتخاب کردنش و پرداخت کردنش و … توی یه فروشگاه اینترنتی. یه جورایی یه نمونه از سناریوی دنیای واقعی رو انجام میدیم ببینیم همه چی خوبه یا نه.

Test Tools
Test Tools

معرفی ابزارهای معروف تست:

یه لیست از اسم یه سری ابزار معروف تست رو اینجا براتون میذارم که اگه خواستید در موردشون بیشتر بخونید.

  • SoapUI
  • Katalo
  • Grafana K6
  • Postman
  • Assertible
  • Swagger
  • Apigee
  • JMeter
  • REST-assured
  • Tricentis
  • Karate
  • REST-console
  • APIFORTRESS
  • Pyresttest
  • Fiddler
  • Airborne

خلاصش که تست بنویسید! اگه تست ننویسید، چیزایی که قرار بوده توی تست متوجه بشید رو مشتری هاتون زنگ میزنن بهتون میگن و این اصلا خوب نیست 🙂


CI
CI

بررسی ‌CI و مزایای اون:

شرایطی رو در نظر بگیرید که ما کد اپلیکیشن مون رو گذاشتیم توی یک گیت ریپازیتوری مثلا توی گیت‌لب و توسعه دهنده‌هامون هم تغییراتی رو که میدن هر روز دارن پوش میکنن توی گیت که در شرایط معمولی هم اغلب همینه و چندین و چند بار در روز پوش انجام میشه. حالا ما می‌تونیم با هر پوشی که انجام میشه یه سری اسکریپت رو فعال کنیم که کد جدید رو بیلد کنه و اپلیکیشن‌مون رو حالا با کد جدیدی که داره، به شکل خودکار تست کنه. به این روش اصطلاحا میگن Continuous Integration یا CI. هر تغییری که سابمیت میشه توی اپلیکیشن‌مون حتی توی برنچ های توسعه و … به شکل اتومیت بیلد و تست میشه هربار.

استفاده از این روش ریسک مون رو کاهش میده ، ارتباط و تعامل افراد پروژه رو بهتر میکنه و کیفیت محصول ما رو بالاتر میبره و به جلوگیری از هدر رفت زمان مون هم کمک میکنه.


CD
CD

بررسی ‌CD و مزایای اون:

حالا یه قدم جلوتر میریم، یعنی با هر پوش به گیت نه تنها کد رو به شکل خودکار بیلد و تست می‌کنیم بلکه کد جدید رو می‌بریم و توی محیط های مختلفی که می‌خوایم دیپلوی هم می‌کنیم. اگه دیپلوی نهایی رو هم سیستم به شکل خودکار انجام بده بهش میگیم Continuous Deployment که زیاد مرسوم نیست ولی اگه برای انجام دیپلوی نهایی نیاز باشه که یه تریگر دستی نهایی انجام بدیم، مثلا یه کلیک کنیم توی گیتمون تا انجام بشه، بهش میگیم Continuous Delivery.

استفاده ازین روش ریسک ریلیزهامون رو میاره پایین، زمان تحویل محصولمون به مارکت رو کمتر میکنه، به کیفیت محصولمون کمک میکنه و هزینه هامون رو کمتر میکنه.

CI/CD Tools
CI/CD Tools

معرفی و مقایسه ابزارهای CI/CD:

کلی ابزار هستن که برای قسمت های مختلف CI/CD بهمون کمک میکنن. ابزارهایی مثل:

  • GitLab
  • Jenkins
  • Circleci
  • TeamCity
  • Bamboo
  • ZUUL
  • Argo
  • GitKube
  • Spinnaker

که معروف ترین هاش گیت‌لب و جنکینز هستن که معمولا ازشون استفاده میشه.

Gitlab vs Jenkins
Gitlab vs Jenkins

مقایسه‌‌ی کامل گیت‌لب با جنکینز:

از نظر طراحی و ساختار: CI/CD گیت‌لب به شکل کامل با پلتفرمش اینتگریت شده و به عنوان یه فیچر داخلی گیت‌لب محسوب میشه و نیاز به نصب کردن چیزی نداره برای اینکه توی گیت‌لب باهاش کار کنیم، اما جنکینز سرور جداگانه خودش رو داره و میتونه به صورت on-premises یا روی سرور ابری بالا بیاد.

از نظر سازگاری با ورژن کنترل سیستم‌ها: CI/CD گیت‌لب به صورت دیفالت سازگاری داره با ریپازیتوری‌های گیت‌لب و فیچرهای کنترلی اونها مثل برنچ و مرج و ریکوئست و پایپ‌لاین‌ها. جنکینز اما به صورت مستقیم با هیچ ورژن کنترل سیستمی بدون نیاز به کانفیگ‌های جداگانه اینتگریت نمیشه و برای استفاده از جنکینز توی ورژن کنترل سیستم‌ها باید از پلاگین‌ها استفاده کنیم. جنکینز از پلاگین‌های زیاد و متنوعی برای وصل شدن به ورژن کنترل سیستم های مختلف پشتیبانی میکنه.

از نظر کانفیگ کردن پایپ لاین: گیت لب از یک فایل به فرمت yaml با نام gitlab-ci.yml. برای تعریف کردن استیج‌های پایپ‌لاین، جاب‌ها و دیپندنسی اونها استفاده میکنه و این فایل کانفیگ رو توی خود ریپازیتوری ذخیره می‌کنیم. اما جنکینز از یک فایل اسکریپت به نام Jenkinsfile استفاده میکنه که می‌تونیم اونو به زبان Groovy بنویسیم یا از یک DSL (domain-specific language) به نام Scripted Pipeline استفاده کنیم یا اینکه با سینتکس جدید تری به نام Declarative Pipeline اسکریپت جنکینز رو بنویسیم.

از نظر راحتی نصب و ستاپ: CI/CD گیت‌لب که به صورت built-in به عنوان فیچر توی خود گیت‌لب هست و همراه اون آپدیت میشه و … . جنکینز اما نیاز به نصب و کانفیگ داره و باید سرور زیرساختش رو منیج و کانفیگ کنیم. همچنین برای آپدیت و آپگرید هم باید یوزر یا ادمین این کار رو انجام بده.

از نظر کامیونیتی: گیت‌لب جامعه در حال رشدی رو داره و اکوسیستمی که تقریبا تمام فیچرها و مرحله‌های CI/CD رو پوشش میده بدون نیاز به پلاگین خاصی، از طرفی جنکینز توی اکوسیستمی که داره یک حجم بالایی از پلاگین هارو توسعه میده و امکان کاستوم کردن جزئیات با دیتیل بالا رو میده و با طیف متنوعی از ابزارها و تکنولوژی‌ها میتونه سازگار بشه.

از نظر اسکیل پذیری و توزیع شدن: گیت لب از بیلدهای دیستریبیوتد و انجام جاب‌ها به صورت موازی از طریق چندین رانر پشتیبانی میکنه و رانرها میتونن روی ماشین‌های جداگانه نصب بشن که به اسکیل کردن گیت‌لب کمک میکنه. جنکینز اما برای اسکیل شدن از روش افزایش تعداد ایجنت های بیلد یا نود ها استفاده میکنه درحالیکه مدیریت زیرساخت و لود بالانس در جنکینز نیاز به نصب و کانفیگ‌های جداگانه داره.


توی قسمت‌های بعدی مسیر دواپس‌مون رو ادامه میدیم و بیشتر گیت‌لب رو با هم بررسی میکنیم.


مراقب خودتون باشید. 🌹🐳🌹




خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.

🫀 Follow DockerMe 🫀

🔔 Follow YouTube 🔔

📣 Follow Instagram 📣

🖇 Follow LinkedIn DockerMe🖇

🔎 Follow Linkedin Ahmad Rafiee 🔎

🕊 Follow Twitter 🕊

داکرمسیر دواپسci cdامنیتتجربه

ci cdgitlabjenkinstestunit test
مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
شاید از این پست‌ها خوشتان بیاید