سبز ٹیسٹ سوٹ تسلی دیتا ہے۔ سب ٹیسٹ پاس ہو گئے، تو کوڈ ٹھیک ہی ہو گا۔ مگر پاس ہونے والا سوٹ صرف یہ بتاتا ہے کہ جن چیزوں کو ٹیسٹ جانچتے ہیں ان میں کچھ ٹوٹا نہیں۔ جو چیزیں وہ کبھی نہیں جانچتے، ان کے بارے میں یہ کچھ نہیں کہتا۔ اس لیے ہم ٹیسٹوں کو بھی جانچتے ہیں، جان بوجھ کر اپنا کوڈ توڑ کر۔
جو ٹیسٹ فیل نہ ہو سکے، وہ ٹیسٹ نہیں
ایک اصول سوچیں: اکاؤنٹ رکھنے کے لیے سولہ سال کا ہونا ضروری ہے۔ کوئی کوڈ لکھتا ہے اور اس کا ٹیسٹ بھی۔ ٹیسٹ جانچتا ہے کہ تیس سال کے شخص کو اجازت ملتی ہے اور دس سال کے کو نہیں۔ ٹیسٹ پاس ہو جاتا ہے۔
اب اصول میں صرف ایک حرف بدلیں:
// the rule
const mayHoldAnAccount = (age: number) => age >= 16;
// the same rule, broken on purpose
const mayHoldAnAccount = (age: number) => age > 16;اب سولہ سال کے شخص کو انکار ہو جاتا ہے۔ کیا ٹیسٹ اسے پکڑتا ہے؟ نہیں۔ تیس والا اب بھی اندر، دس والا اب بھی باہر، اور سوٹ سبز ہی رہتا ہے۔ اصول غلط ہے، اور کسی چیز نے ہمیں نہیں بتایا۔
میوٹیشن ٹیسٹنگ، سادہ الفاظ میں
اس چھوٹی، جان بوجھ کر ڈالی گئی خرابی کو میوٹنٹ کہتے ہیں۔ میوٹیشن ٹیسٹنگ کا مطلب ہے ایسے بہت سے میوٹنٹ بنانا، ایک وقت میں ایک، اور ہر ایک پر ٹیسٹ چلانا:
- کوڈ میں ایک چھوٹی سی چیز بدلیں: کوئی موازنہ الٹ دیں، کوئی جانچ ہٹا دیں، کوئی قدر بدل دیں۔
- ٹیسٹ چلائیں۔
- اگر کوئی ٹیسٹ فیل ہو جائے تو میوٹنٹ پکڑا گیا۔ اچھی بات۔
- اگر سب ٹیسٹ اب بھی پاس ہوں تو میوٹنٹ بچ نکلا، اور ایک ٹیسٹ کم ہے۔ ہم وہ لکھتے ہیں۔
مثال کا حل ایک اور ٹیسٹ ہے: سولہ سال کے شخص کو اجازت ملتی ہے۔ یہ ٹیسٹ موجود ہو تو ٹوٹا ہوا اصول سوٹ کو فوراً سرخ کر دیتا ہے۔
ہم اسے کیسے استعمال کرتے ہیں
یہ ترتیب اہم ہے۔ جس ٹیسٹ کو ہم نے کبھی فیل ہوتے نہیں دیکھا، ہو سکتا ہے وہ کچھ جانچ ہی نہ رہا ہو۔ پہلے اسے سرخ ہوتے دیکھنا ثبوت ہے کہ وہ اسی خرابی کو پکڑے گا جس کے لیے لکھا گیا۔
میوٹنٹ واحد جانچ نہیں۔ ہر تبدیلی پورے ٹیسٹ سوٹ سے بھی گزرتی ہے۔ کچھ کوڈ کو ہم بڑی مقدار میں بے ترتیب ان پٹ دیتے ہیں، تاکہ وہ صورتیں ملیں جو کسی نے لکھنے کا سوچا ہی نہیں۔ ایک ویریفیکیشن سرور ایک طے شدہ شیڈول پر سوٹ، میوٹنٹس کا ایک حصہ اور لیک شدہ خفیہ معلومات کی تلاش دوبارہ چلاتا ہے، اور جو ملے اس کی رپورٹ دیتا ہے۔ ہر مرحلے کے آخر میں جائزہ لینے والے پوری کوشش کرتے ہیں کہ ہماری بنائی چیز کو توڑ دیں، اس سے پہلے کہ ہم اسے مکمل کہیں۔
یہ کیا ثابت نہیں کرتا
میوٹیشن ٹیسٹنگ بتاتی ہے کہ آپ کے ٹیسٹ ان خرابیوں کو پکڑ لیں گے جو آپ نے ڈالیں۔ یہ ثابت نہیں کر سکتی کہ کوڈ میں کوئی خرابی ہے ہی نہیں، اور یہ آزاد آڈٹ کی جگہ نہیں لیتی۔ اسی لیے ٹریکر پر جو چیز آڈٹ کی منتظر ہو، وہ مکمل نظر نہیں آ سکتی، چاہے وہ کتنے ہی ٹیسٹ پاس کرے۔
آپ کو اس کی پروا کیوں ہونی چاہیے
جب ہمارے ٹریکر پر کام کا کوئی حصہ آگے بڑھتا ہے تو اس لیے کہ کوئی ریپوزیٹری بدلی، اور وہ تبدیلی پہلے ان جانچوں سے گزری۔ کوئی بھی ہاتھ سے عدد نہیں لکھ سکتا۔ ہم آپ کو تیز مگر غلط بار کے بجائے سست مگر سچی بار دکھانا پسند کریں گے۔