میرا CI/CD پائپ لائن 3 ماہ تک پاس رہا — پھر میں نے لاگز پڑھے
سبز رنگ کے چیک مارکس دیکھ کر اچھا لگتا ہے۔ ہر پل ریکوسٹ (pull request) پاس ہو رہی تھی۔ ہر ڈیپلائمنٹ (deploy) کام کر رہی تھی۔
پھر ایک صارف نے ایک خراب فیچر کی اطلاع دی۔ وہ ہفتوں سے خراب تھا۔
میں نے پائپ لائن کے لاگز کھولے۔ ہماری پاس ہونے والی بلڈز (builds) نے ہم سے جھوٹ بولا تھا۔
ہمارا عمل بالکل مکمل نظر آتا تھا:
- Linting
- Unit tests
- Integration tests
- Build
- Deploy
مہینوں تک ہر مرحلے کی کامیابی کی شرح 100% رہی۔
ایکسپورٹ بٹن پر کلک کرنے سے کچھ نہیں ہو رہا تھا۔ کوئی ایرر (error) ظاہر نہیں ہوا۔ میں نے اس کا سراغ 11 ہفتے پہلے کی گئی ایک تبدیلی تک لگایا۔ پائپ لائن پاس ہو گئی تھی۔ کوڈ ریویو (code review) منظور ہو گیا تھا۔ فیچر شروع سے ہی خراب تھا۔
مسئلہ ہمارا کوڈ نہیں تھا۔ مسئلہ ہمارا ٹیسٹ کوڈ تھا۔
ہمارے انٹیگریشن ٹیسٹ (integration tests) ہر چیز کے لیے mocks استعمال کر رہے تھے۔ ہم نے پوری ایکسپورٹ سروس کو mock کر دیا تھا۔ ٹیسٹ نے اصل کوڈ کے بجائے mock کو چیک کیا۔ mock ہمیشہ کامیابی (success) کا اسٹیٹس واپس کرتا تھا۔
ہم over-mocking کے جال میں پھنس گئے تھے:
- Unit tests: یونٹ کو الگ کرنے کے لیے ہر چیز کو mock کر دیا۔ یہ ٹھیک ہے۔
- Integration tests: رفتار کے لیے ہر چیز کو mock کر دیا۔ یہ ایک غلطی ہے۔
- E2E tests: اس مخصوص فلو (flow) کو نظر انداز کر دیا۔
ہمارے انٹیگریشن ٹیسٹ محض مہنگے یونٹ ٹیسٹ تھے۔ انہوں نے صرف یہ تصدیق کی کہ ہمارے mocks کام کر رہے ہیں۔ انہوں نے یہ تصدیق نہیں کی کہ ہمارا کوڈ کام کر رہا ہے۔
میں نے اسے ٹھیک کرنے کے لیے تین تبدیلیاں کیں:
mocks کو صرف یونٹ ٹیسٹ تک محدود رکھیں۔ انٹیگریشن ٹیسٹ کو اصل ڈیٹا بیس، APIs، اور فائل سسٹم تک رسائی حاصل کرنی چاہیے۔ اگر کوئی ٹیسٹ سست ہے، تو اسے mock کے پیچھے نہ چھپائیں۔ اس رفتار کو بہتر بنانے (optimize) کے اشارے کے طور پر استعمال کریں۔
کنٹریکٹ ٹیسٹ (contract tests) شامل کریں۔ یہ اس بات کو یقینی بناتے ہیں کہ آپ کے mocks اصل سروس کے رویے سے مطابقت رکھتے ہوں۔ اگر کوئی mock ایسا ڈیٹا واپس کرتا ہے جو اصل سروس نہیں کرے گی، تو کنٹریکٹ ٹیسٹ فیل ہو جائے گا۔
اصل کوریج (coverage) پر نظر رکھیں۔ ہم نے محض پاس ہونے کی شرح دیکھنا بند کر دی۔ ہم نے دیکھا کہ ٹیسٹ اصل میں کن چیزوں کو چلا رہے ہیں۔ ہماری کوریج کے اعداد و شمار 94% سے گر کر 67% ہو گئے۔ یہ ہمارے پاس موجود سب سے ایماندارانہ پیمانہ (metric) تھا۔
سبز پائپ لائن کا مطلب یہ نہیں کہ آپ کا کوڈ کام کر رہا ہے۔ اس کا مطلب یہ ہے کہ آپ کے ٹیسٹ پاس ہو گئے ہیں۔ یہ دونوں مختلف چیزیں ہیں۔
سب سے خطرناک بگ (bugs) وہ ہوتے ہیں جن کے بارے میں آپ کی پائپ لائن کہتی ہے کہ وہ ٹھیک ہیں۔
خود سے یہ سوالات پوچھیں:
- کیا میرے ٹیسٹ بگ پکڑ رہے ہیں یا صرف mocks کی تصدیق کر رہے ہیں؟
- کیا میرے انٹیگریشن ٹیسٹ واقعی انٹیگریٹ (integrate) کرتے ہیں؟
- اگر میں تمام mocks ہٹا دوں، تو کتنے ٹیسٹ اب بھی پاس ہوں گے؟
- کیا میں کوریج ناپ رہا ہوں یا اعتماد (confidence)؟
وہ پائپ لائن جو کبھی فیل نہیں ہوتی، قابل بھروسہ نہیں ہوتی۔ وہ غیر آزمودہ (untested) ہوتی ہے۔
Source: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
