আমার CI/CD পাইপলাইন ৩ মাস ধরে পাস করছিল — তারপর আমি লগগুলো পড়লাম

সবুজ টিক চিহ্ন দেখলে ভালো লাগে। প্রতিটি pull request পাস হয়েছে। প্রতিটি deploy সফল হয়েছে।

তারপর একজন ব্যবহারকারী একটি ত্রুটিপূর্ণ ফিচারের কথা জানালেন। এটি কয়েক সপ্তাহ ধরে অকেজো ছিল।

আমি পাইপলাইন লগগুলো খুললাম। আমাদের সফল বিল্ডগুলো আমাদের সাথে মিথ্যা বলেছিল।

আমাদের প্রক্রিয়াটি নিখুঁত মনে হচ্ছিল:

  • Linting
  • Unit tests
  • Integration tests
  • Build
  • Deploy

মাসের পর মাস প্রতিটি ধাপের সাফল্যের হার ছিল ১০০%।

ক্লিক করার পর এক্সপোর্ট বাটনটি কিছুই করছিল না। কোনো error দেখাচ্ছিল না। আমি ১১ সপ্তাহ আগের একটি পরিবর্তনের কারণ খুঁজে বের করলাম। পাইপলাইন পাস হয়েছিল। কোড রিভিউ অনুমোদিত হয়েছিল। ফিচারটি শুরু থেকেই অকেজো ছিল।

সমস্যাটি আমাদের কোডে ছিল না। সমস্যাটি ছিল আমাদের টেস্ট কোডে।

আমাদের integration tests সবকিছুতেই mocks ব্যবহার করছিল। আমরা পুরো export service-টিকে mock করেছিলাম। টেস্টটি আসল কোডের পরিবর্তে mock-টি পরীক্ষা করছিল। mock-টি সবসময় success status রিটার্ন করছিল।

আমরা over-mocking-এর ফাঁদে পড়েছিলাম:

  • Unit tests: ইউনিটটিকে আলাদা করার জন্য সবকিছু mock করা হয়েছিল। এটি ঠিক আছে।
  • Integration tests: গতির জন্য সবকিছু mock করা হয়েছিল। এটি একটি ভুল।
  • E2E tests: এই নির্দিষ্ট flow-টি বাদ পড়ে গিয়েছিল।

আমাদের integration tests ছিল কেবল ব্যয়বহুল unit tests। সেগুলো যাচাই করছিল যে আমাদের mocks কাজ করছে কি না। সেগুলো যাচাই করছিল না যে আমাদের কোড কাজ করছে কি না।

এটি ঠিক করতে আমি তিনটি পরিবর্তন করেছি:

  1. mocks-এর ব্যবহার শুধুমাত্র unit tests-এর মধ্যে সীমাবদ্ধ রাখুন। Integration tests অবশ্যই আসল databases, APIs, এবং file systems ব্যবহার করবে। যদি কোনো টেস্ট ধীরগতির হয়, তবে সেটি mock দিয়ে লুকিয়ে রাখবেন না। সেই ধীরগতিকে অপ্টিমাইজ করার সংকেত হিসেবে ব্যবহার করুন।

  2. contract tests যোগ করুন। এগুলো নিশ্চিত করে যে আপনার mocks গুলো আসল সার্ভিসের আচরণের সাথে মিল রয়েছে। যদি একটি mock এমন ডেটা রিটার্ন করে যা আসল সার্ভিস করবে না, তবে contract test ফেইল করবে।

  3. আসল coverage ট্র্যাক করুন। আমরা কেবল পাস রেট দেখা বন্ধ করে দিয়েছি। আমরা দেখতে শুরু করেছি টেস্টগুলো আসলে কী কী পরীক্ষা করছে। আমাদের coverage সংখ্যা ৯৪% থেকে কমে ৬৭% হয়ে গিয়েছিল। এটিই ছিল আমাদের কাছে থাকা সবচেয়ে সৎ metric।

একটি সবুজ পাইপলাইন মানেই এই নয় যে আপনার কোড কাজ করছে। এর মানে হলো আপনার টেস্টগুলো পাস হয়েছে। এই দুটি ভিন্ন বিষয়।

সবচেয়ে বিপজ্জনক bugs হলো সেগুলো, যেগুলোকে আপনার পাইপলাইন ঠিক বলে জানায়।

নিজেকে এই প্রশ্নগুলো করুন:

  • আমার টেস্টগুলো কি bugs ধরছে নাকি কেবল mocks নিশ্চিত করছে?
  • আমার integration tests কি আসলেই integrate করছে?
  • আমি যদি সব mocks সরিয়ে দিই, তবে কতগুলো টেস্ট পাস করবে?
  • আমি কি coverage মাপছি নাকি confidence?

যে পাইপলাইন কখনোই ফেইল করে না, তা নির্ভরযোগ্য নয়। সেটি আসলে untested।

Source: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj