skip to Main Content

کدهای کامیت شده کدهای تست شده هستند!

هیچ وقت کدهای تست نشده رو کامیت نکنیم!

کامیت کدهای تست شده

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

اصلا چرا مشکل به وجود میاد ؟

زمانی که ما یک امکان جدید به سیستم اضافه میکنیم امکان داره اون امکان روی یه جایی از سیستم که قبلا اضافه کردیم و حتی قبلا کار میکرده تاثیر منفی و مخرب بزاره . یکی از دلایل نوشتن تست برای نرم افزار هایی که مینویسیم اینه که بتونیم به سرعت کدهامون رو اجرا کنیم و از صحت کارکرد اونها مطمئن بشیم یا به قولی (جلوی Side Effect های مخرب  رو بگیریم).

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

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

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

 

راه حل :‌

برای اینکه تو وقتمون صرفه جویی کنیم و اتوماتیک قبل هر کامیت تست ها رو اجرا کنیم و اگر تست ها به درستی انجام شدند و پاس شدند کامیت رو انجام بدیم (بدون زدن دستور اضافه) باید از امکانات Git Hook استفاده کنیم .

در واقع گیت هوک ها اسکرپیت هایی هستند که قبل یا بعد از از رخدادهای commit و push و receive اجرا میشن و جزو قابلت های از پیش تعریف شده گیت هستند و نیازی به دانلود اونها نیست و فقط به تخیل توسعه دهنده محدود میش ، پس تقریبا قبل این ایونت ها میتونیم هر کار دلمون خواست انجام بدیم . مثلا از دیتابیس بک اپ بگیریم یا یه نشوته ای رو به کاربر نشون بدیم و اینکاری که ما الان میخواییم انجام بدیم اینه که قبل از کامیت تست هامون رو اجرا کنیم و در صورت درست کار کردن تست ها و پاس شدن آنها کدهامون رو کامیت کنیم . 

برای این کار نیاز داریم یک فایل جدید ایچاد کنیم در گیت لوکال خودمون ، که میتونید از دستور زیر استفاده کنید:

[php]

vim .git/hooks/pre-commit

[/php]

اگر با ویرایشگر VIM کار نکردید یه سرچی بکنید در کل ویرایشگر خوبی هست رو لینوکس . بعد از این مرحله کدهای زیر رو به این فایل اضافه کنید .

[php]

#!/usr/bin/env php

<?php

echo "Running tests.. ";
exec(‘vendor/bin/phpunit’, $output, $returnCode);
if ($returnCode !== 0) {
// Show full output
echo PHP_EOL . implode($output, PHP_EOL) . PHP_EOL;
echo "Aborting commit.." . PHP_EOL;
exit(1);
}
// Show summary (last line)
echo array_pop($output) . PHP_EOL;
exit(0);

[/php]

 

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

 

 

Back To Top