அண்மையில் மேற்கொள்ளப்பட்ட ஒரு deployment, அனைத்து unit test, integration test மற்றும் mock-server சரிபார்ப்புகளும் வெற்றிகரமாக முடிந்தும், மூன்று மைக்ரோசர்வீஸ்களை (microservices) செயலிழக்கச் செய்தது. அந்தத் குழு தங்கள் API mocks-க்கு பதிலாக contract testing முறையைப் பயன்படுத்தியது. ஆறு மாதங்களில், ஒப்பந்தங்களின் எண்ணிக்கை மூன்றிலிருந்து 47 ஆக உயர்ந்ததுடன், மாதாந்திர integration-failure விகிதம் இரண்டு சம்பவங்களிலிருந்து பூஜ்ஜியமாகக் குறைந்தது.

மாக்ஸ்கள் (Mocks) உங்களைப் பாதுகாக்க ஏன் முடியாது

ஒரு mock server, ஒரு நுகர்வோர் (consumer) எதை எதிர்பார்க்கிறாரோ அதன் வடிவத்தை மட்டுமே பிரதிபலிக்கிறது; வழங்குநர் (provider) உண்மையில் அந்த வடிவத்தை வழங்குகிறாரா என்பதை அது ஒருபோதும் சரிபார்ப்பதில்லை. ஒரு வழங்குநர் ஒரு புலத்தின் (field) பெயரை மாற்றினால்—உதாரணமாக name-லிருந்து display_name-க்கு மாற்றினால்—அந்த mock இன்னும் பழைய தரவையே (payload) வழங்கும், நுகர்வோரின் சோதனைகள் (tests) சரியாகவே காட்டும், ஆனால் நேரடி அமைப்பு (live system) செயலிழந்துவிடும். செவ்வாய்க்கிழமை மதியம் 2 மணிக்கு நடந்த அந்தத் தயாரிப்புத் தோல்வி (production failure) சரியாக அதுதான்: அந்த mock உண்மையான ஒப்பந்தத்தைப் பற்றி "பொய்" கூறியது.

ஒப்பந்தச் சோதனை (Contract testing) இடைவெளியை நிரப்புகிறது

எந்தவொரு குறியீடும் (code) தயாரிப்புச் சூழலுக்கு (production) செல்வதற்கு முன்பே, ஒரு API-இன் இரு தரப்பினரும் ஒரு பொதுவான வரையறையில் உடன்பட ஒப்பந்தச் சோதனை கட்டாயப்படுத்துகிறது. இதில் இரண்டு பொதுவான அணுகுமுறைகள் உள்ளன:

  • நுகர்வோர் சார்ந்த ஒப்பந்தங்கள் (Consumer-driven contracts) – நுகர்வோர் சேவை தனது எதிர்பார்ப்புகளை எழுதுகிறது; வழங்கும் சேவை அவற்றைச் சரிபார்க்கிறது. இது ஒன்றாக இணைந்து வளரும் உள் மைக்ரோசர்வீஸ்களுக்கு (internal microservices) சிறப்பாகச் செயல்படும்.
  • வழங்குநர் சார்ந்த ஒப்பந்தங்கள் (Provider-driven contracts) – வழங்குநர் ஒரு விவரக்குறிப்பை (specification) வெளியிடுகிறார்; நுகர்வோர் தங்கள் குறியீட்டை அதனுடன் ஒப்பிட்டுச் சரிபார்க்கிறார்கள். இது பொதுவான API-களுக்கான வழக்கமான முறையாகும்.

முதல் அணுகுமுறை பொதுவாக ஒரு மைக்ரோசர்வீஸ் கட்டமைப்பிற்குள் ஏற்படும் ஒருங்கிணைப்புத் தோல்விகளைத் தடுக்கிறது.

நுகர்வோர் சார்ந்த ஒப்பந்தம் எவ்வாறு செயல்படுகிறது

  1. நுகர்வோர், வழங்குநரிடமிருந்து தனக்குத் துல்லியமாக என்ன தேவை என்பதை விவரிக்கும் ஒரு சோதனையை எழுதுகிறார்.
  2. அந்தச் சோதனையை இயக்குவதன் மூலம் ஒரு pact file உருவாக்கப்படுகிறது – இது அந்த எதிர்பார்ப்புகளைப் பதிவு செய்யும் ஒரு JSON ஆவணம் ஆகும்.
  3. வழங்குநர் தனது CI pipeline-இல் pact file-ஐக் கொண்டு தனது உண்மையான சேவையை இயக்குகிறார்.
  4. வழங்குநர் ஒரு புலத்தை மாற்றினால், சரிபார்ப்பு தோல்வியடையும் மற்றும் build தடுக்கப்படும்.

சரிபார்ப்பு உண்மையான வழங்குநர் குறியீட்டின் (provider code) மீது இயங்குவதால், எந்தவொரு பாதிப்பை ஏற்படுத்தும் மாற்றமும் deployment-க்கு முன்பே கண்டறியப்படுகிறது.

உங்கள் சோதனை பிரமிடில் (test pyramid) ஒப்பந்தச் சோதனைகள் எங்கு இருக்க வேண்டும்

  • Unit tests – வேகமானவை, தனிமைப்படுத்தப்பட்ட தர்க்கத்தை (logic) சோதிக்கின்றன.
  • Contract tests – நடுத்தர வேகம், API ஒப்பந்தங்கள் சரியாக இருப்பதை உறுதி செய்கின்றன.
  • End-to-end tests – மெதுவானவை, முழுமையான வணிகச் செயல்பாடுகளைச் சோதிக்கின்றன.

ஒப்பந்தச் சோதனைகளை, unit test-களின் விரைவான பின்னூட்டத்திற்கும் (feedback), end-to-end தொகுப்புகளின் விரிவான கவரேஜிற்கும் இடையிலான ஒரு பாலமாகப் பாருங்கள். அடிக்கடி தோல்வியடையும் integration புள்ளிகளைக் கண்டறிந்து, இரண்டு அல்லது மூன்று முக்கியமான endpoints-களுடன் தொடங்கவும்.

நிஜ உலகப் பயன்பாட்டு கதை

இந்தக் கட்டுரையைத் தூண்டிய குழு, தங்களின் மிகவும் பலவீனமான அழைப்புகளை (fragile calls) உள்ளடக்கிய மூன்று ஒப்பந்தங்களுடன் தொடங்கினர். ஆறு மாதங்களுக்குப் பிறகு, சேவைகளுக்கு இடையிலான பெரும்பாலான போக்குவரத்தை (inter-service traffic) உள்ளடக்கிய 47 ஒப்பந்தங்களை அவர்கள் வைத்திருந்தனர். அந்த காலகட்டத்தில், API முறிவுச் சம்பவங்கள் மாதத்திற்கு இரண்டு என்பதிலிருந்து பூஜ்ஜியமாகக் குறைந்தது.

ஒப்பந்தச் சோதனை எப்போது தேவையில்லை

  • நீங்கள் அனைத்து சேவைகளையும் ஒரே களஞ்சியத்தில் (single repository) வைத்திருக்கும் ஒரு தனி டெவலப்பர் (solo developer) ஆக இருந்தால்.
  • அந்த API விதிவிலக்கான நிலைத்தன்மை கொண்டது மற்றும் பல ஆண்டுகளாக மாறாமல் இருந்தால்.
  • நீங்கள் விரைவில் கைவிடப்படவிருக்கும் ஒரு முன்மாதிரியை (prototype) உருவாக்கி இருந்தால்.

அத்தகைய சூழ்நிலைகளில், ஒப்பந்தங்களைப் பராமரிப்பதற்கான கூடுதல் பணி (overhead), அதன் பலனை விட அதிகமாக இருக்கலாம்.

சாத்தியமான குறைபாடுகள் மற்றும் அவற்றை எவ்வாறு கையாள்வது

  • ஒப்பந்தங்களை அவை விவரிக்கும் குறியீட்டுடன் (code) சேர்த்து பதிப்புப்படுத்தவும் (versioned).
  • காலாவதியான ஒப்பந்தங்களைத் தவிர்க்க, ஒவ்வொரு CI ஓட்டத்திலும் சரிபார்ப்பைத் தானியக்கமாக்கவும் (automate).
  • தற்செயலான முறிவுகளைக் கண்டறிய, pull requests-களில் ஒப்பந்த மாற்றங்களைச் சரிபார்க்கவும்.

முக்கியக் கருத்து

உங்கள் சேவைகள் ஒன்றோடு ஒன்று பேசிக்கொள்ள முடியும் என்று உங்களை நீங்களே நம்பிக்க, இன்னும் கைமுறையாக உருவாக்கப்பட்ட mocks-களை மட்டுமே நீங்கள் நம்பியிருந்தால், நீங்கள் ஒரு பொய்யான வாக்குறுதியின் மீது பந்தயம் கட்டுகிறீர்கள். ஒப்பந்தச் சோதனை அந்தப் பந்தயத்தை ஒரு சரிபார்க்கக்கூடிய ஒப்பந்தமாக மாற்றுகிறது; இது பாதிப்பை ஏற்படுத்தும் மாற்றங்கள் தயாரிப்புச் சூழலைச் சென்றடைவதற்கு முன்பே அவற்றைக் கண்டறிந்து, அந்தத் குழுவின் புள்ளிவிவரங்கள் காட்டுவது போல, ஒருங்கிணைப்புத் தோல்விகளை முற்றிலும் நீக்க முடியும்.