నా CI/CD పైప్లైన్ 3 నెలల పాటు విజయవంతంగా సాగింది — ఆ తర్వాత నేను లాగ్లను చదివాను
గ్రీన్ చెక్మార్క్లు చూడటానికి బాగుంటాయి. ప్రతి పుల్ రిక్వెస్ట్ (pull request) పాస్ అయ్యింది. ప్రతి డిప్లాయ్ (deploy) విజయవంతమైంది.
అప్పుడు ఒక యూజర్ ఒక ఫీచర్ పనిచేయడం లేదని రిపోర్ట్ చేశారు. అది వారాల తరబడి పాడైపోయి ఉంది.
నేను పైప్లైన్ లాగ్లను (logs) ఓపెన్ చేశాను. మా పాస్ అయిన బిల్డ్స్ మాకు అబద్ధం చెప్పాయి.
మా ప్రక్రియ పరిపూర్ణంగా కనిపించింది:
- Linting
- Unit tests
- Integration tests
- Build
- Deploy
నెలల తరబడి ప్రతి దశలోనూ 100% సక్సెస్ రేట్ ఉంది.
ఎక్స్పోర్ట్ (export) బటన్ను క్లిక్ చేసినప్పుడు ఏమీ జరగలేదు. ఎటువంటి ఎర్రర్ (error) కూడా కనిపించలేదు. నేను దానిని 11 వారాల క్రితం జరిగిన ఒక మార్పు వరకు వెతికి పట్టుకున్నాను. పైప్లైన్ పాస్ అయ్యింది. కోడ్ రివ్యూ (code review) ఆమోదించబడింది. ఆ ఫీచర్ మొదటి నుంచే పాడైపోయింది.
సమస్య మా కోడ్లో లేదు. మా టెస్ట్ కోడ్లో ఉంది.
మా ఇంటిగ్రేషన్ టెస్ట్లు (integration tests) ప్రతిదానికీ మోక్స్ (mocks) ఉపయోగిస్తున్నాయి. మేము మొత్తం ఎక్స్పోర్ట్ సర్వీస్ను మోక్ చేశాము. టెస్ట్ అసలు కోడ్కు బదులుగా మోక్ను తనిఖీ చేసింది. ఆ మోక్ ఎల్లప్పుడూ సక్సెస్ స్టేటస్ను మాత్రమే తిరిగి ఇచ్చింది.
మేము ఓవర్-మోకింగ్ (over-mocking) ఉచ్చులో పడ్డాము:
- Unit tests: యూనిట్ను ఐసోలేట్ చేయడానికి ప్రతిదాన్ని మోక్ చేశాము. ఇది పర్వాలేదు.
- Integration tests: వేగం కోసం ప్రతిదాన్ని మోక్ చేశాము. ఇది ఒక తప్పు.
- E2E tests: ఈ నిర్దిష్ట ఫ్లోను (flow) గమనించలేదు.
మా ఇంటిగ్రేషన్ టెస్ట్లు కేవలం ఖరీదైన యూనిట్ టెస్ట్లుగా మాత్రమే ఉన్నాయి. అవి మా మోక్స్ పనిచేస్తున్నాయని నిర్ధారించాయి తప్ప, మా కోడ్ పనిచేస్తుందని నిర్ధారించలేదు.
దీనిని సరిచేయడానికి నేను మూడు మార్పులు చేశాను:
మోక్స్ను యూనిట్ టెస్ట్లకు మాత్రమే పరిమితం చేయండి. ఇంటిగ్రేషన్ టెస్ట్లు ఖచ్చితంగా రియల్ డేటాబేస్లు, APIs మరియు ఫైల్ సిస్టమ్లను ఉపయోగించాలి. ఒక టెస్ట్ నెమ్మదిగా ఉంటే, దానిని మోక్తో దాచకండి. ఆ వేగాన్ని ఆప్టిమైజ్ చేయడానికి ఒక సంకేతంగా ఉపయోగించండి.
కాంట్రాక్ట్ టెస్ట్లను (contract tests) జోడించండి. ఇవి మీ మోక్స్ అసలు సర్వీస్ ప్రవర్తనతో సరిపోలుతున్నాయని నిర్ధారిస్తాయి. ఒకవేళ మోక్, అసలు సర్వీస్ ఇవ్వని డేటాను ఇస్తే, కాంట్రాక్ట్ టెస్ట్ ఫెయిల్ అవుతుంది.
రియల్ కవరేజీని (real coverage) ట్రాక్ చేయండి. మేము కేవలం పాస్ రేట్లను చూడటం ఆపివేశాము. టెస్ట్లు నిజంగా దేనిని పరీక్షించాయో దానిని గమనించాము. మా కవరేజ్ నంబర్లు 94% నుండి 67%కి పడిపోయాయి. మా వద్ద ఉన్న అత్యంత నిజాయితీతో కూడిన మెట్రిక్ (metric) ఇదే.
గ్రీన్ పైప్లైన్ అంటే మీ కోడ్ పనిచేస్తుందని కాదు. దాని అర్థం మీ టెస్ట్లు పాస్ అయ్యాయని. ఇవి రెండూ వేర్వేరు విషయాలు.
పైప్లైన్ అంతా బాగుందని చెప్పే బగ్స్ (bugs) అత్యంత ప్రమాదకరమైనవి.
మిమ్మల్ని మీరు ఈ ప్రశ్నలు అడగండి:
- నా టెస్ట్లు బగ్స్ను పట్టుకుంటున్నాయా లేదా కేవలం మోక్స్ను నిర్ధారిస్తున్నాయా?
- నా ఇంటిగ్రేషన్ టెస్ట్లు నిజంగా ఇంటిగ్రేట్ అవుతున్నాయా?
- నేను అన్ని మోక్స్ను తొలగిస్తే, ఎన్ని టెస్ట్లు ఇంకా పాస్ అవుతాయి?
- నేను కవరేజీని కొలుస్తున్నానా లేక నమ్మకాన్ని (confidence) కొలుస్తున్నానా?
ఎప్పుడూ ఫెయిల్ కాని పైప్లైన్ నమ్మదగినది కాదు. అది పరీక్షించబడలేదు (untested).
Source: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
