મારી CI/CD પાઇપલાઇન 3 મહિના સુધી પાસ થઈ — પછી મેં લોગ્સ વાંચ્યા

લીલા ચેકમાર્ક સારા લાગે છે. દરેક pull request પાસ થઈ. દરેક deploy સફળ રહ્યું.

પછી એક યુઝરે બગડેલી ફીચર વિશે જાણ કરી. તે અઠવાડિયાથી બગડેલી હતી.

મેં પાઇપલાઇન લોગ્સ ખોલ્યા. અમારી પાસ થતી બિલ્ડ્સ અમને જૂઠું બોલી રહી હતી.

અમારી પ્રક્રિયા સંપૂર્ણ લાગતી હતી:

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

મહિનાઓ સુધી દરેક સ્ટેપમાં 100% સફળતાનો દર હતો.

એક્સપોર્ટ બટન પર ક્લિક કરવાથી કંઈ જ થતું નહોતું. કોઈ એરર પણ દેખાતી નહોતી. મેં તપાસ કરી તો ખબર પડી કે 11 અઠવાડિયા પહેલા થયેલા ફેરફારને કારણે આવું થઈ રહ્યું હતું. પાઇપલાઇન પાસ થઈ હતી. કોડ રિવ્યુ મંજૂર થયો હતો. ફીચર શરૂઆતથી જ બગડેલું હતું.

સમસ્યા અમારા કોડમાં નહોતી. તે અમારા ટેસ્ટ કોડમાં હતી.

અમારા integration tests બધી વસ્તુઓ માટે mocks નો ઉપયોગ કરી રહ્યા હતા. અમે આખી export service ને mock કરી હતી. ટેસ્ટ વાસ્તવિક કોડને બદલે mock ને ચેક કરી રહ્યો હતો. mock હંમેશા success status રિટર્ન કરતું હતું.

અમે over-mocking ના જાળમાં ફસાઈ ગયા હતા:

  • Unit tests: યુનિટને અલગ કરવા માટે બધું mock કર્યું. આ બરાબર છે.
  • Integration tests: ઝડપ માટે બધું mock કર્યું. આ એક ભૂલ છે.
  • E2E tests: આ ચોક્કસ ફ્લો રહી ગયો હતો.

અમારા 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 ના આંકડા 94% થી ઘટીને 67% થઈ ગયા. આ અમારી પાસે રહેલું સૌથી પ્રમાણિક માપદંડ હતો.

ગ્રીન પાઇપલાઇનનો અર્થ એ નથી કે તમારો કોડ કામ કરે છે. તેનો અર્થ એ છે કે તમારા ટેસ્ટ પાસ થયા છે. આ બંને અલગ બાબતો છે.

સૌથી ખતરનાક બગ્સ એ છે જે તમારા પાઇપલાઇન કહે છે કે બધું બરાબર છે.

તમારી જાતને આ પ્રશ્નો પૂછો:

  • શું મારા ટેસ્ટ બગ્સ પકડી રહ્યા છે કે માત્ર 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