ప్రతి యూనిట్ టెస్ట్, ఇంటిగ్రేషన్ టెస్ట్ మరియు మాక్-సర్వర్ చెక్ విజయవంతమైనప్పటికీ, ఇటీవలి డిప్లాయ్మెంట్ వల్ల మూడు మైక్రోసర్వీసెస్ విఫలమయ్యాయి. ఆ తర్వాత టీమ్ తమ API మాక్స్కు బదులుగా కాంట్రాక్ట్ టెస్టింగ్ను ఉపయోగించడం ప్రారంభించింది. ఆరు నెలల్లో, కాంట్రాక్ట్ సంఖ్య మూడు నుండి 47కి పెరిగింది మరియు నెలవారీ ఇంటిగ్రేషన్-ఫెయిల్యూర్ రేటు రెండు సంఘటనల నుండి సున్నాకి తగ్గింది.
మాక్స్ (mocks) మిమ్మల్ని ఎందుకు రక్షించలేవు
ఒక మాక్ సర్వర్ కన్స్యూమర్ ఆశించే ఆకారాన్ని మాత్రమే అనుకరిస్తుంది; ప్రొవైడర్ నిజంగా అదే ఆకారాన్ని అందిస్తుందో లేదో అది ఎప్పుడూ తనిఖీ చేయదు. ఒకవేళ ప్రొవైడర్ ఒక ఫీల్డ్ను పేరు మార్చితే—ఉదాహరణకు name నుండి display_name కి—మాక్ ఇంకా పాత పేలోడ్నే తిరిగి ఇస్తుంది, కన్స్యూమర్ యొక్క టెస్ట్లు గ్రీన్ (green) గానే ఉంటాయి, కానీ లైవ్ సిస్టమ్ క్రాష్ అవుతుంది. మంగళవారం మధ్యాహ్నం 2 గంటలకు జరిగిన ప్రొడక్షన్ ఫెయిల్యూర్ సరిగ్గా అదే: మాక్ నిజమైన కాంట్రాక్ట్ గురించి "అబద్ధం" చెప్పింది.
కాంట్రాక్ట్ టెస్టింగ్ లోపాన్ని పూరిస్తుంది
ఏ కోడ్ కూడా ప్రొడక్షన్లోకి వెళ్లేముందు, API యొక్క రెండు వైపులా ఒక ఉమ్మడి నిర్వచనంపై ఏకీభవించేలా కాంట్రాక్ట్ టెస్టింగ్ చేస్తుంది. దీనికి రెండు సాధారణ పద్ధతులు ఉన్నాయి:
- కన్స్యూమర్-డ్రివెన్ కాంట్రాక్ట్స్ (Consumer-driven contracts) – కన్స్యూమింగ్ సర్వీస్ ఆశయాలను (expectations) రాస్తుంది; ప్రొవైడింగ్ సర్వీస్ వాటిని ధృవీకరిస్తుంది. ఇది కలిసి అభివృద్ధి చెందే అంతర్గత మైక్రోసర్వీసులకు బాగా పనిచేస్తుంది.
- ప్రొవైడర్-డ్రివెన్ కాంట్రాక్ట్స్ (Provider-driven contracts) – ప్రొవైడర్ ఒక స్పెసిఫికేషన్ను ప్రచురిస్తుంది; కన్స్యూమర్లు తమ కోడ్ను దానితో సరిపోల్చుకుంటారు. ఇది పబ్లిక్ APIల కోసం సాధారణంగా ఉపయోగించే పద్ధతి.
మొదటి పద్ధతి సాధారణంగా మైక్రోసర్వీస్ ఆర్కిటెక్చర్లో విఫలమయ్యే ఇంటిగ్రేషన్లను నివారిస్తుంది.
కన్స్యూమర్-డ్రివెన్ కాంట్రాక్ట్ ఎలా పనిచేస్తుంది
- కన్స్యూమర్ ప్రొవైడర్ నుండి తనకు ఖచ్చితంగా ఏమి కావాలో వివరిస్తూ ఒక టెస్ట్ను రాస్తుంది.
- ఆ టెస్ట్ను రన్ చేయడం ద్వారా ఒక pact file రూపొందుతుంది – ఇది ఆ ఆశయాలను రికార్డ్ చేసే ఒక JSON డాక్యుమెంట్.
- ప్రొవైడర్ తన CI పైప్లైన్లో pact ఫైల్తో పాటు తన నిజమైన సర్వీస్ను రన్ చేస్తుంది.
- ఒకవేళ ప్రొవైడర్ ఏదైనా ఫీల్డ్ను మారిస్తే, వెరిఫికేషన్ విఫలమవుతుంది మరియు బిల్డ్ ఆగిపోతుంది.
వెరిఫికేషన్ అసలు ప్రొవైడర్ కోడ్పై జరుగుతుంది కాబట్టి, ఏదైనా విచ్ఛిన్నమయ్యే మార్పు (breaking change) డిప్లాయ్మెంట్ తర్వాత కాకుండా, ముందే గుర్తించబడుతుంది.
మీ టెస్ట్ పిరమిడ్లో కాంట్రాక్ట్ టెస్ట్లు ఎక్కడ ఉండాలి
- యూనిట్ టెస్ట్లు (Unit tests) – వేగంగా పనిచేస్తాయి, ఐసోలేటెడ్ లాజిక్ను పరీక్షిస్తాయి.
- కాంట్రాక్ట్ టెస్ట్లు (Contract tests) – మధ్యస్థ వేగం, API ఒప్పందాలు సరిగ్గా ఉన్నాయని నిర్ధారిస్తాయి.
- ఎండ్-టు-ఎండ్ టెస్ట్లు (End-to-end tests) – నెమ్మదిగా ఉంటాయి, పూర్తి బిజినెస్ ఫ్లోలను పరీక్షిస్తాయి.
యూనిట్ టెస్ట్ల వేగవంతమైన ఫీడ్బ్యాక్ మరియు ఎండ్-టు-ఎండ్ సూట్ల విస్తృత కవరేజీ మధ్య వంతెనగా కాంట్రాక్ట్ టెస్ట్లను పరిగణించండి. తరచుగా విఫలమయ్యే ఇంటిగ్రేషన్ పాయింట్లను లక్ష్యంగా చేసుకోండి మరియు రెండు లేదా మూడు కీలకమైన ఎండ్పాయింట్లతో ప్రారంభించండి.
వాస్తవ ప్రపంచ అనువర్తన కథ
ఈ వ్యాసానికి ప్రేరణనిచ్చిన టీమ్, తమ అత్యంత సున్నితమైన కాల్స్ను కవర్ చేసే మూడు కాంట్రాక్ట్లతో ప్రారంభించింది. ఆరు నెలల తర్వాత, వారు ఇంటర్-సర్వీస్ ట్రాఫిక్లో మెజారిటీని కవర్ చేసే 47 కాంట్రాక్ట్లను కలిగి ఉన్నారు. ఆ కాలంలో API విచ్ఛిన్నమయ్యే సంఘటనలు నెలకు రెండు నుండి సున్నాకి తగ్గాయి.
కాంట్రాక్ట్ టెస్టింగ్ ఎప్పుడు అవసరం లేకపోవచ్చు
- మీరు అన్ని సర్వీసులను ఒకే రిపోజిటరీలో ఉంచుకునే సోలో డెవలపర్ అయితే.
- API చాలా స్థిరంగా ఉండి, సంవత్సరాలుగా మారకపోతే.
- మీరు త్వరగా పారేసే ఒక ప్రోటోటైప్ను నిర్మిస్తుంటే.
అటువంటి సందర్భాలలో, కాంట్రాక్ట్లను నిర్వహించే శ్రమ (overhead) దాని ప్రయోజనం కంటే ఎక్కువగా ఉండవచ్చు.
సంభావ్య ప్రతికూలతలు మరియు వాటిని ఎలా తగ్గించాలి
- కాంట్రాక్ట్లను అవి వివరించే కోడ్తో పాటు వెర్షన్ చేయండి.
- పాతబడిన (stale) కాంట్రాక్ట్లను నివారించడానికి ప్రతి CI రన్లో వెరిఫికేషన్ను ఆటోమేట్ చేయండి.
- అనుకోకుండా జరిగే విచ్ఛిన్నతలను గుర్తించడానికి పుల్ రిక్వెస్ట్లలో కాంట్రాక్ట్ మార్పులను సమీక్షించండి.
సారాంశం
మీ సర్వీసులు మాట్లాడుకోగలవని మిమ్మల్ని మీరు నమ్మించుకోవడానికి మీరు ఇంకా మాన్యువల్గా తయారు చేసిన మాక్స్పైనే ఆధారపడుతుంటే, మీరు ఒక తప్పుడు వాగ్దానంపై పందెం వేస్తున్నట్లే. కాంట్రాక్ట్ టెస్టింగ్ ఆ పందెాన్ని ధృవీకరించదగిన ఒప్పందంగా మారుస్తుంది, విచ్ఛిన్నమయ్యే మార్పులు ప్రొడక్షన్కు చేరుకోకముందే వాటిని గుర్తిస్తుంది మరియు ఆ టీమ్ గణాంకాలు చూపినట్లుగా, ఇంటిగ్రేషన్ వైఫల్యాలను పూర్తిగా తొలగించగలదు.
