JavaRush /جاوا بلاگ /Random-UR /کافی وقفہ نمبر 87۔ ڈویلپرز کے لیے یونٹ ٹیسٹنگ کیوں اہم ہے...

کافی وقفہ نمبر 87۔ ڈویلپرز کے لیے یونٹ ٹیسٹنگ کیوں اہم ہے؟ جاوا میں ایک صف کو کاپی کرنے کے 5 طریقے

گروپ میں شائع ہوا۔

ڈویلپرز کے لیے یونٹ ٹیسٹنگ کیوں اہم ہے؟

ماخذ: SearchSoftwareQuality آئیے اس بات پر بات کرتے ہیں کہ یونٹ ٹیسٹنگ کیوں اہم اور قیمتی ہے، اور یہ ڈیبگنگ کو کیسے آسان بناتا ہے۔ یونٹ ٹیسٹنگ سافٹ ویئر کے معیار کو بہتر بنانے کے لیے ایک طاقتور ٹول ہے۔ یونٹ ٹیسٹ بنیادی تصدیق فراہم کرتے ہیں کہ ایک ایپلیکیشن سافٹ ویئر کی وضاحتوں کے مطابق ہے اور حسب منشا برتاؤ کرتی ہے۔ کافی وقفہ نمبر 87۔  ڈویلپرز کے لیے یونٹ ٹیسٹنگ کیوں اہم ہے؟  جاوا میں ایک صف کو کاپی کرنے کے 5 طریقے - 1اچھی طرح سے ہونے پر، یونٹ ٹیسٹ:
  • نقائص کی تعداد کو کم کرنا اور ترقی کی زندگی کے ابتدائی مراحل میں ان کی شناخت کرنا؛
  • کوڈ پڑھنے کی اہلیت کو بہتر بنانا؛
  • کوڈ کو دوبارہ استعمال کرنے کی اجازت دیں؛
  • تعیناتی کی رفتار میں اضافہ.
آئیے دیکھتے ہیں کہ یونٹ ٹیسٹنگ کیوں اہم ہے، اس قسم کی جانچ کیسے شروع ہوئی، اور اس کے نفاذ میں کیا رکاوٹیں ہیں۔

یونٹ ٹیسٹنگ کی تاریخ

ابتدائی مرحلے میں پائی جانے والی غلطی سے وقت اور محنت کی بچت ہوتی ہے۔ کمپیوٹر کی تاریخ کے پہلے 50 سالوں کے لئے، یونٹ ٹیسٹنگ اور ڈیبگنگ بنیادی طور پر ایک ہی چیز تھی۔ لیکن 1990 کی دہائی تک، کوڈ اتنا پیچیدہ ہو گیا تھا کہ نظام کو الگ تھلگ چلانے کے لیے چھوٹے حصوں میں تقسیم کرنا اکثر ناممکن تھا۔ 1997 میں، کینٹ بیک نامی پروگرامر نے JUnit بنایا، جو کوڈ کے چھوٹے ٹکڑوں کی جانچ کے لیے ایک ترقیاتی ماحول کا پلگ ان ہے۔ ٹیسٹ کوڈ جو سورس کوڈ کی جانچ کرتا ہے اسے یونٹ ٹیسٹ کہا جاتا ہے۔ اس قسم کی یونٹ ٹیسٹنگ کئی سالوں سے ایک اہم چیز بن گئی ہے۔ بیک نے JUnit بنانے کے بعد، مارٹن فولر نے ایک کتاب لکھی، Refactoring، جس میں اس نے کوڈ کو مزید الگ تھلگ اور قابل آزمائش بنانے کے لیے تبدیل کرنے کے طریقے تجویز کیے تھے۔ کوڈ ری فیکٹرنگ اور یونٹ ٹیسٹنگ کا امتزاج ٹیسٹ پر مبنی ترقی کا باعث بنا ہے، جہاں پروگرامنگ کے عمل کے لیے یونٹ ٹیسٹ کی تخلیق ضروری ہے۔ اس میں، کوڈ کو بننے سے پہلے ہی قابل جانچ ہونا چاہیے۔ اس طرح، پروگرامنگ کا عمل اس وقت تک مکمل نہیں ہوتا جب تک یونٹ ٹیسٹ نہیں چلائے جاتے۔ اس کے بعد پروجیکٹ سسٹم کی سطح یا انسانی سطح کے تحقیقی مرحلے میں جا سکتا ہے۔

یونٹ ٹیسٹنگ کی مثال

یہ مثال یونٹ ٹیسٹنگ کی اہمیت کو ظاہر کرتی ہے۔ یہاں JUnit ایک سادہ فنکشن کا اندازہ کرتا ہے جو درجہ حرارت کو فارن ہائیٹ سے سیلسیس میں تبدیل کرتا ہے۔ تبدیلی کا فارمولا: C = (F-32) * 5/9۔ صرف چند لائنیں، بشمول فنکشن کے دستخط اور گھوبگھرالی منحنی خطوط وحدانی، کوڈ میں لائبریری فنکشن کے طور پر لاگو کیا جا سکتا ہے۔ تاہم، یہ فنکشن سے واضح نہیں ہے کہ یہ معیار ہیں. ان اختیارات میں اوپر یا نیچے، حقیقی نمبر، یا اوپری اور نیچے کی حدیں شامل ہو سکتی ہیں۔ آئیے ٹیسٹ::مزید ماڈیول کا استعمال کرتے ہوئے پرل میں درجہ حرارت کی تبدیلی کے فنکشن کے لیے مثال یونٹ ٹیسٹ بنائیں۔ پہلی سطر ایک تبصرہ ہے جو پروگرامر کو بتاتا ہے کہ باقی کوڈ سے کیا توقع کی جائے۔
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
JUnit فریم ورک آبجیکٹ پر مبنی سسٹمز اور ٹیسٹ آبجیکٹ پر انحصار کرتا ہے، لیکن تصور ایک جیسا ہے۔

الگ تھلگ یونٹ ٹیسٹ

یونٹ ٹیسٹ کے فوائد میں سے ایک یہ ہے کہ وہ کسی فنکشن، کلاس یا طریقہ کو الگ تھلگ کرتے ہیں اور کوڈ کے صرف اس ٹکڑے کی جانچ کرتے ہیں۔ بہتر انفرادی اجزاء نظام کی مجموعی لچک فراہم کرتے ہیں۔ اس طرح آپ کو قابل اعتماد کوڈ ملتا ہے۔ یونٹ ٹیسٹ ڈیبگنگ کے عمل کی نوعیت کو بھی بدل دیتے ہیں۔ کسی مسئلے کو ٹھیک کرنے کی کوشش کرنے کے لیے، پروگرامرز صرف ایک ناکام ٹیسٹ لکھتے ہیں اور پھر اسے دہراتے ہیں تاکہ یہ پچھلی توقعات کی خلاف ورزی کیے بغیر گزر جائے۔ یہ عمل سیٹ اپ، دوبارہ تخلیق، توقف اور ٹیسٹ کے ذریعے روایتی ڈیبگنگ کے دستی سائیکل کو ختم کرتا ہے۔ کوڈ کو یونٹ ٹیسٹنگ کے لیے موزوں بنانے کے لیے تبدیل کرنے کے لیے، پروگرامرز کو اپنے کام کرنے کا طریقہ تبدیل کرنا چاہیے۔ یونٹ ٹیسٹ کے بغیر لکھے گئے کوڈ کے کسی بھی ٹکڑے کو ممکنہ طور پر غیر ٹیسٹ شدہ سمجھا جائے گا، کم از کم انفرادی ماڈیولز کے طور پر۔

ڈھالنے والے یونٹ ٹیسٹ

لیگیسی سافٹ ویئر وہ سافٹ ویئر ہے جو طویل عرصے سے چل رہا ہے اور غالباً یونٹ ٹیسٹ کے بغیر لکھا گیا تھا۔ کمپنی کے لیے میراثی کوڈ کی قدر ہے۔ یہ کئی سالوں سے مستقل طور پر کام کرتا ہے۔ یونٹ ٹیسٹ کے بغیر بنائے گئے کچھ پروگرام روزانہ ملین ڈالر کے لین دین پر کارروائی کرتے ہیں۔ لیکن کوڈ جس میں یونٹ ٹیسٹ نہیں ہوتے ہیں وہ وقت کے ساتھ ساتھ گندگی کی ایک بڑی گیند میں بدل جاتا ہے کیونکہ اسے کئی سالوں میں کوڈ مینٹیننس پروگرامرز نے چھوا ہے۔ ری فیکٹرنگ پروگرامرز کو بتدریج کسی سسٹم میں تبدیلیاں کرنے کی اجازت دیتی ہے تاکہ اسے قابل آزمائش بنایا جا سکے۔ تاہم، ان تبدیلیوں میں وقت لگتا ہے۔ کئی سال پہلے، میں نے اپنے ساتھی باب ریسلمین کے ساتھ میراثی ایپلی کیشنز کے لیے یونٹ ٹیسٹ استعمال کرنے کے مسئلے پر بات کی۔ ریسلمین نے استدلال کیا کہ بغیر تعمیر کردہ ایپلی کیشنز میں یونٹ ٹیسٹنگ کو لاگو کرنا بہت مہنگا اور احمقانہ بھی ہے۔ اس کے بجائے، اس نے تجویز کی کہ تنظیم یونٹ ٹیسٹ کے ساتھ نئی ترقی شروع کرے اور میراثی ایپلی کیشنز کو تنہا چھوڑ دے۔ یہ COBOL، رپورٹ جنریٹرز، اور دیگر ایپلی کیشنز کے لیے درست ہو سکتا ہے، لیکن میں یہ بحث کروں گا کہ جدید زبانوں میں لکھی گئی ایپلی کیشنز — C++، C#، Java، اور Ruby — میں یونٹ ٹیسٹس کا اضافہ کرنا کافی آسان ہے۔ انہیں پوری ایپلیکیشن کے لیے لکھنے کے بجائے، آپ جاتے وقت موجودہ تبدیلی اور ریفیکٹر میں یونٹ ٹیسٹ شامل کریں۔

رفتار، معیار اور جانچ کی صلاحیت میں اضافہ

پراجیکٹ مینیجرز کا کہنا ہے کہ منصوبہ بندی میں معیار، کام کی مقدار، وسائل اور وقت کے درمیان تجارت شامل ہوتی ہے۔ ایک علاقے میں کچھ شامل کرنے کے لیے، آپ کو دوسرے علاقے سے کچھ لے جانا چاہیے۔ مؤثر یونٹ ٹیسٹ اس اصول کو توڑ دیتے ہیں۔ یہی وجہ ہے کہ یونٹ ٹیسٹنگ تنظیموں کے لیے اہم اور قیمتی ہے۔ اچھے یونٹ ٹیسٹ قابل جانچ کوڈ تیار کرتے ہیں جو معیار کو بہتر بناتا ہے۔ اس کوڈ میں کم نقائص ہوں گے، جس کا مطلب ہے کہ پروجیکٹ کو تیزی سے مکمل کرنے کے لیے کم بگ فکسز ہیں۔ جب سافٹ ویئر میں کیڑے آتے ہیں، تو یونٹ ٹیسٹ ڈیبگنگ، فکسنگ، اور کوڈ لکھنے کی رفتار بڑھا دیتے ہیں۔ اور یہ اس طرح ہوتا ہے کہ بیک وقت کوڈ کے معیار اور رفتار کو بہتر بناتے ہوئے خرابی کے دوبارہ ہونے کا امکان نمایاں طور پر کم ہو جاتا ہے۔ اگرچہ سافٹ ویئر ڈویلپمنٹ میں کوئی جادوئی گولی نہیں ہے، لیکن موثر یونٹ ٹیسٹ ترقی، جانچ، اور یہاں تک کہ انجینئرنگ کی کچھ فنکشنل ضروریات کو تیز کر سکتے ہیں۔

جاوا میں ایک صف کو کاپی کرنے کے 5 طریقے

Source: Dev.to تو آپ کے پاس دو arrays A اور B ہیں اور آپ کو عناصر کو A سے B میں کاپی کرنے کی ضرورت ہے۔ ٹھیک ہے، جاوا میں ایسا کرنے کے مختلف طریقے ہیں اور میں آپ کو ابھی دکھاؤں گا۔

طریقہ ایک: ForLoop

یہ وہ جگہ ہے جہاں لوپ کے لئے اچھا پرانا ہماری مدد کو آتا ہے :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

طریقہ دو: .clone()

صف کلوننگ کا طریقہ مطلوبہ نتیجہ حاصل کرنے میں بھی مدد کر سکتا ہے:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

طریقہ تین: System.arraycopy()

اگلا طریقہ System.arraycopy() طریقہ استعمال کرنا ہے ، جو java.lang پیکیج میں ہے ۔ اس سے پہلے کہ ہم اس کے استعمال پر جائیں، آئیے اس کے دستخط پر بات کرتے ہیں:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
درخواست:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

طریقہ چار: Arrays.copyOf()

اگلا کاپی آپشن جس پر ہم بحث کریں گے وہ ہے java.utils پیکیج سے Arrays کلاس ۔ اس کے دستخط پر توجہ دیں:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
درخواست:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

طریقہ پانچ: Arrays.copyOfRange()

لہذا، یہ آخری آپشن ہوگا جسے ہم اس پوسٹ میں دیکھیں گے۔ یہ java.utils پیکیج میں موجود Arrays کلاس سے بھی ہے ۔ آئیے اس کے دستخط کو دوبارہ دیکھتے ہیں:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
درخواست:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION