تست خودکار نرم افزار با استفاده از jenkins

اگر برنامه نویس هستید احتمالا با مشکلات زیادی که هنگام برنامه نویسی پیش می آید برخورد کرده اید. شروع کار هر پروژه کامپیوتری که از روش سنتی و بدون تست استفاده میکند معمولا سریع پیش می رود و رفته رفته سرعت توسعه کم و کمتر می شود. این شرایط درست شبیه به شرایطی است که در باتلاق رخ میدهد هر چه بیشتر دست و پا می زنید بیشتر غرق می شوید...

علت اصلی این امر معمولا افزایش ناخواسته میزان باگ هاست. ذهن انسان هنگام انجام یک کار ممکن است دچار خطا شود و یا یک موضوع کوچک را نبیند این مشکلات کوچک رفته رفته جمع شده و به یک فاجعه تبدیل می شوند.معمولا دلیل کاهش سرعت در پروژه های کامپیوتری نیز همین است برنامه نویسان که حال و حوصله نوشتن تست برای کدهای خود را ندارند مشغول برطرف کردن مشکلاتی می شوند که خودشان ناخواسته آنها را ایجاد کرده اند. رفته رفته میزان زمانی که برای این کار اختصاص می دهند افزایش می یابد تا جایی که تقریبا تمام زمان آنها صرف اشکال زدایی (debugging) و یافتن مشکلات کدهایی می شود که خودشان آنها را نوشته اند ! به این ترتیب آرام آرام در باتلاقی عمیق فرو می روند که بیرون آمدن از آن کار ساده ای نیست.

همین روند باعث شد تا روشی جدید برای برنامه نویسی به نام test driven development یا به اختصار TDD ابداع شود. در این روش یک سیکل دائمی وجود دارد که منجر به کاهش جشمگیر میزان باگ ها خواهد شد.

 در شکل بالا روند کلی این روش نشان داده شده است. این روش به این صورت است که برنامه نویس باید دو توع کد را موازی با هم پیش ببرد یکی کد اصلی و دیگری کد تست نام دارد. کد تست کد اصلی را تست می کند و کد اصلی خود برنامه اصلی است. روند کار در TDD به این صورت است که ابتدا سعی می کنیم تستی بینویسیم که fail شود. سپس سعی می کنیم تا کد اصلی خود را طوری تغییر دهیم که آن تست pass شود بعد از این کار به تمیز کردن کدهایی که زدیم می پردازیم (مثلا انتخاب نام های بهتر برای متغیرها و کم کردن حجم توابعی که نوشتیم برای خواناتر شدن کد) بعد از این کار این روند را تا ابد تکرار می کنیم. اگر بخواهیم نمودار بالا را ساده تر نشان دهیم می توانیم آن را به سه قسمت Red و Green و Refactor تقسیم کنیم :

  1. RED : در این حالت هدف نوشتن تستی است که fail شود. شاید پیش خودتان بپرسید چرا باید همچین کاری کرد ؟ جواب این سوال در اینجاست که شما fail شدن تست خود را با چشمان خود می بینید و به این ترتیب به تستی که نوشتید اطمینان پیدا می کنید وقتی در ادامه راه توانستید pass شدن آن را هم ببینید آن وقت هم test شدن و هم pass شدن آن را دیده اید و مطمئن می شوید که این تست درست کار می کند این نکته خیلی مهمی است
  2. GREEN : برای تستی که در مرحله قبل fail شده کد اصلی ای مینویسید که تست fail شده را pass کند به این ترتیب شما به تست خود اعتماد می کنید چون هم fail شدن و هم pass شدن اش را دیده اید
  3. REFACTOR : در این مرحله کدهایی که در دو مرحله قبل زده اید را از لحاظ خوانایی بهتر میکنید مثلا کارهایی از قبیل کم کردن تعداد خطوط توابع یا بهینه کردن پارامترهای ورودی آنها 

 

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

نقش jenkins در این داستان کجاست ؟

حال که نقش تست نرم افزار را درک کردید به سراغ یکی از ابزارهای معروف برای continuous integration به نام jenkins می رویم. این برنامه برای کار تیمی روی یک پروژه درست شده است و بطور اتوماتیک خودش با یک اتفاق خاص (مثلا هر ۲۰ دقیقه یکبار یا با هر بار push کردن کد) تست هایی که برایش به عنوان یک کار (job) تعریف کردیم را اجرا کند و بلافاصله نتیجه را نشان میدهد اگر تست ها fail شدند تمام اطلاعات ذخیره شده و معلوم میشود که با کدام commit بوده که تست fail شده و مشکل را میتوان سریعتر حل کرد مثلا مدیر پروژه میتواند این موضوع را سریعا دیده و اطلاع دهد تا مشکل قبل از بزرگتر شدن حل شود.

نصب jenkins

برای نصب jenkins می توانید به آدرس jenkins.io رفته و متناسب با سیستم عامل خود installer موردنظر خود را دانلود و نصب کنید. همچنین اگر java runtime برروی سیستم شما نصب است می توانید فایل نصب war. را دانلود کنید و با دستور زیر آنرا اجرا کنید:

java -jar <name of file>.war

در دستور بالا به جای <name of the file> نام فایلی را که دانلود کرده اید قرار دهید. (مثلا jenkins.war) بعد از اجرای این دستور در log هایی که در اجرای دستور می آیند شماره پورتی که سرور روی آن اجرا می شوند نمایش داده میشود (معمولا این عدد ۸۰۸۰ است) بعد از اینکه سرور آماده برای کار شد میتوانید در مرورگر  ip و port ای که دارید را وارد کنید (اگر local هستید این آدرس localhost:port و اگر برروی سرور این عملیات را انجام دادید server_ip:port را وارد کنید.) پس از انجام مراحل نصب باید چیزی شبیه به تصویر زیر ببینید

این وب اپلیکیشن قسمت های مختلفی دارد مثلا بخش people در منوی سمت چپ افرادی که در سیستم حضور دارند و پروژه های مرتبط با آنها را نمایش می دهد. بخش دیگر new item نام دارد که یکی از اصلی ترین بخش های این نرم افزار است. این بخش برای ایجاد job جدید درست شده. job ها معمولا همان کارهایی هستند که قرار است برای تست کدهای اصلی مان انجام دهیم. مثلا یک job میتواند این باشد که به ازای هر بار push به سرور یک سری تست برروی کدها انجام شود تا اگر تستی fail شد سریعا مشخص شود و سریعا برطرف شود یا حتی میتوان اگر تستی fail شد اجازه push به کاربر داده نشود تا مجبور شود تست ها را  pass کند. البته نتیجه این کار را زمانی میتوان مشاهده کرد که تست ها کامل و خوب نوشته شده باشند اگر تست ها ناقص باشند باز هم احتمال وقوع باتلاقی که در ابتدای بحث کردیم وجود دارد !

یک مثال ساده از continuous integration با استفاده از jenkins

برای این که با طرز کار  jenkins بهتر آشنا شوید با یک مثال ساده از یک پروژه django بحث را ادامه می دهیم. django یک فریمورک برای ساخت وب سایت است که با زبان برنامه نویسی پایتون (python) نوشته شده است. معمولا وقتی حرف از تست نرم افزار به میان می آید اکثر اوقات منظور unit testing است. به زبان ساده Unit test یعنی تست کردن جزء به جزء سیستم بطور مجزا مثلا یعنی ابنکه به توابع سیستم ورودی های مختلف بدهیم و چک کنیم آیا خروجی های آن با چیزی که انتظار داریم یکسان است یا خیر. در django هم میتوانیم از Unit test ای که خود فریمورک در اختیار ما قرار داده استفاده کنیم تا برنامه خود را تست کنیم. در این مثال میخواهیم کاری کنیم تا بعد از هر بار تغییر در کد هنگام push یکبار تست هایی که برای وب اپلیکیشن نوشتیم اجرا شود و نتیجه را به ما نشان دهد.دقت کنید که مراحل برای تقریبا تمام پروژه های دیگر با هرزبان برنامه نویسی و فریمورکی قابل اجراست ما فقط برای اینکه نتیجه را ملموس تر نشان دهیم با یک پروژه ساده شروع کردیم. مراحل زیر را دنبال کنید:

  1. ابتدا در ضحه اصلی بر روی new item کلیک کنید.
  2. سپس یک نام برای item‌ جدید انتخاب کرده و گزینه free style project را انتخاب کنید و برروی ok کلیک کنید. 
  3. در صفحه جدیدی که ایجاد میشود در قسمت Source Code Management گزینه git را انتخاب کنید و تنظیمات مربوط به repository خود را که میخواهید با هر بار push تغییراتش را چک کنید وارد کنید
  4. در قسمت build همین تنظیمات general کدی را که میخواهید به ازای هر بار Push شدن اجرا شود وارد کنید (در django برای اجرای unit test ها باید دستور python manage.py test را اجرا کرد که میتوان در همین قسمت وارد کرد)پس از ذخیره کردن تنظیمات با هر بار تغییر در کدهای اصلی و push کردن به سرور jenkins کدهای جدید را تست میکند و نتیجه را اعلام میکند که میتوان در صفحه مربوط به item ایجاد شده آن را مشاهده کرد.
© از شما برای بازنشر مطالب به همراه لینک سایت ممنونیم!