മലയാളം

ജാവാസ്ക്രിപ്റ്റിൽ ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ് (TDD) പഠിക്കുക. ഈ സമഗ്ര ഗൈഡ് റെഡ്-ഗ്രീൻ-റിഫാക്ടർ സൈക്കിൾ, Jest ഉപയോഗിച്ചുള്ള പ്രായോഗിക നടപ്പാക്കൽ, ആധുനിക വികസനത്തിനുള്ള മികച്ച രീതികൾ എന്നിവ ഉൾക്കൊള്ളുന്നു.

ജാവാസ്ക്രിപ്റ്റിലെ ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ്: ആഗോള ഡെവലപ്പർമാർക്കുള്ള ഒരു സമഗ്ര ഗൈഡ്

ഈ സാഹചര്യം ഒന്നാലോചിച്ചു നോക്കൂ: ഒരു വലിയ, പഴയ സിസ്റ്റത്തിലെ ഒരു പ്രധാന കോഡ് ഭാഗം മാറ്റിയെഴുതാൻ നിങ്ങളെ ഏൽപ്പിച്ചിരിക്കുന്നു. നിങ്ങൾക്ക് ഒരുതരം ഭയം തോന്നുന്നു. നിങ്ങളുടെ മാറ്റം മറ്റെന്തെങ്കിലും തകരാറിലാക്കുമോ? സിസ്റ്റം ഇപ്പോഴും ഉദ്ദേശിച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നുണ്ടെന്ന് എങ്ങനെ ഉറപ്പാക്കാൻ കഴിയും? മാറ്റത്തോടുള്ള ഈ ഭയം സോഫ്റ്റ്‌വെയർ ഡെവലപ്‌മെന്റിലെ ഒരു സാധാരണ പ്രശ്നമാണ്, ഇത് പലപ്പോഴും വേഗത കുറഞ്ഞ പുരോഗതിക്കും ദുർബലമായ ആപ്ലിക്കേഷനുകൾക്കും കാരണമാകുന്നു. എന്നാൽ പിശകുകൾ പ്രൊഡക്ഷനിലെത്തുന്നതിന് മുമ്പുതന്നെ കണ്ടെത്താൻ സഹായിക്കുന്ന ഒരു സുരക്ഷാ വലയം സൃഷ്ടിച്ച്, ആത്മവിശ്വാസത്തോടെ സോഫ്റ്റ്‌വെയർ നിർമ്മിക്കാൻ ഒരു വഴിയുണ്ടെങ്കിലോ? ഇതാണ് ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ് (TDD) വാഗ്ദാനം ചെയ്യുന്നത്.

TDD കേവലം ഒരു ടെസ്റ്റിംഗ് രീതി മാത്രമല്ല; ഇത് സോഫ്റ്റ്‌വെയർ ഡിസൈനിനും ഡെവലപ്‌മെന്റിനുമുള്ള ചിട്ടയായ ഒരു സമീപനമാണ്. ഇത് പരമ്പരാഗതമായ "കോഡ് എഴുതുക, പിന്നെ ടെസ്റ്റ് ചെയ്യുക" എന്ന മാതൃകയെ തലകീഴായി മാറ്റുന്നു. TDD ഉപയോഗിച്ച്, പ്രൊഡക്ഷൻ കോഡ് എഴുതുന്നതിന് മുമ്പ് പരാജയപ്പെടുന്ന ഒരു ടെസ്റ്റ് നിങ്ങൾ എഴുതുന്നു. ഈ ലളിതമായ മാറ്റം കോഡിന്റെ ഗുണമേന്മ, രൂപകൽപ്പന, പരിപാലനം എന്നിവയിൽ വലിയ സ്വാധീനം ചെലുത്തുന്നു. ഈ ഗൈഡ്, പ്രൊഫഷണൽ ഡെവലപ്പർമാരുടെ ഒരു ആഗോള സമൂഹത്തിനായി രൂപകൽപ്പന ചെയ്ത, ജാവാസ്ക്രിപ്റ്റിൽ TDD നടപ്പിലാക്കുന്നതിനെക്കുറിച്ചുള്ള സമഗ്രവും പ്രായോഗികവുമായ ഒരു കാഴ്ച നൽകും.

എന്താണ് ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ് (TDD)?

അടിസ്ഥാനപരമായി, ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ് വളരെ ചെറിയൊരു ഡെവലപ്‌മെന്റ് സൈക്കിളിന്റെ ആവർത്തനത്തെ ആശ്രയിക്കുന്ന ഒരു പ്രക്രിയയാണ്. ഫീച്ചറുകൾ എഴുതി പിന്നീട് അവയെ ടെസ്റ്റ് ചെയ്യുന്നതിന് പകരം, ആദ്യം ടെസ്റ്റ് എഴുതണമെന്ന് TDD നിർബന്ധിക്കുന്നു. ഫീച്ചർ നിലവിലില്ലാത്തതിനാൽ ഈ ടെസ്റ്റ് തീർച്ചയായും പരാജയപ്പെടും. പിന്നീട്, ആ നിർദ്ദിഷ്ട ടെസ്റ്റ് പാസാക്കാൻ ആവശ്യമായ ഏറ്റവും ലളിതമായ കോഡ് എഴുതുക എന്നതാണ് ഡെവലപ്പറുടെ ജോലി. അത് പാസായിക്കഴിഞ്ഞാൽ, കോഡ് വൃത്തിയാക്കുകയും മെച്ചപ്പെടുത്തുകയും ചെയ്യുന്നു. ഈ അടിസ്ഥാന ലൂപ്പിനെ "റെഡ്-ഗ്രീൻ-റിഫാക്ടർ" സൈക്കിൾ എന്ന് വിളിക്കുന്നു.

TDD-യുടെ താളം: റെഡ്-ഗ്രീൻ-റിഫാക്ടർ

ഈ മൂന്ന്-ഘട്ടങ്ങളുള്ള സൈക്കിളാണ് TDD-യുടെ ഹൃദയമിടിപ്പ്. ഈ താളം മനസ്സിലാക്കുകയും പരിശീലിക്കുകയും ചെയ്യുന്നത് ഈ സാങ്കേതികതയിൽ വൈദഗ്ദ്ധ്യം നേടുന്നതിന് അത്യന്താപേക്ഷിതമാണ്.

ഒരു ചെറിയ ഫംഗ്‌ഷനുവേണ്ടി സൈക്കിൾ പൂർത്തിയായിക്കഴിഞ്ഞാൽ, അടുത്ത ഭാഗത്തിനായി ഒരു പുതിയ പരാജയപ്പെടുന്ന ടെസ്റ്റുമായി നിങ്ങൾ വീണ്ടും ആരംഭിക്കുന്നു.

TDD-യുടെ മൂന്ന് നിയമങ്ങൾ

അജൈൽ സോഫ്റ്റ്‌വെയർ പ്രസ്ഥാനത്തിലെ ഒരു പ്രധാന വ്യക്തിയായ റോബർട്ട് സി. മാർട്ടിൻ ("അങ്കിൾ ബോബ്" എന്ന് അറിയപ്പെടുന്നു), TDD-യുടെ ചിട്ടയെ ക്രോഡീകരിക്കുന്ന മൂന്ന് ലളിതമായ നിയമങ്ങൾ നിർവചിച്ചു:

  1. പരാജയപ്പെടുന്ന ഒരു യൂണിറ്റ് ടെസ്റ്റ് പാസാക്കാൻ വേണ്ടിയല്ലാതെ നിങ്ങൾ ഒരു പ്രൊഡക്ഷൻ കോഡും എഴുതരുത്.
  2. പരാജയപ്പെടാൻ ആവശ്യമായതിലും കൂടുതൽ യൂണിറ്റ് ടെസ്റ്റ് നിങ്ങൾ എഴുതരുത്; കംപൈലേഷൻ പരാജയങ്ങളും പരാജയങ്ങൾ തന്നെയാണ്.
  3. പരാജയപ്പെട്ടുകൊണ്ടിരിക്കുന്ന ഒരൊറ്റ യൂണിറ്റ് ടെസ്റ്റ് പാസാക്കാൻ ആവശ്യമായതിലും കൂടുതൽ പ്രൊഡക്ഷൻ കോഡ് നിങ്ങൾ എഴുതരുത്.

ഈ നിയമങ്ങൾ പാലിക്കുന്നത് നിങ്ങളെ റെഡ്-ഗ്രീൻ-റിഫാക്ടർ സൈക്കിളിലേക്ക് നിർബന്ധിക്കുകയും നിങ്ങളുടെ പ്രൊഡക്ഷൻ കോഡിന്റെ 100% ഒരു നിർദ്ദിഷ്ട, പരീക്ഷിച്ച ആവശ്യകതയെ തൃപ്തിപ്പെടുത്തുന്നതിനാണ് എഴുതുന്നതെന്ന് ഉറപ്പാക്കുകയും ചെയ്യുന്നു.

എന്തുകൊണ്ട് നിങ്ങൾ TDD സ്വീകരിക്കണം? ആഗോള ബിസിനസ്സ് കേസ്

TDD വ്യക്തിഗത ഡെവലപ്പർമാർക്ക് വലിയ നേട്ടങ്ങൾ നൽകുമ്പോൾ, അതിന്റെ യഥാർത്ഥ ശക്തി ടീം, ബിസിനസ്സ് തലങ്ങളിലാണ് തിരിച്ചറിയുന്നത്, പ്രത്യേകിച്ചും ആഗോളതലത്തിൽ വിതരണം ചെയ്യപ്പെട്ട സാഹചര്യങ്ങളിൽ.

നിങ്ങളുടെ ജാവാസ്ക്രിപ്റ്റ് TDD എൻവയോൺമെന്റ് സജ്ജീകരിക്കൽ

ജാവാസ്ക്രിപ്റ്റിൽ TDD ഉപയോഗിച്ച് തുടങ്ങുന്നതിന്, നിങ്ങൾക്ക് ചില ഉപകരണങ്ങൾ ആവശ്യമാണ്. ആധുനിക ജാവാസ്ക്രിപ്റ്റ് ഇക്കോസിസ്റ്റം മികച്ച ചോയിസുകൾ വാഗ്ദാനം ചെയ്യുന്നു.

ഒരു ടെസ്റ്റിംഗ് സ്റ്റാക്കിന്റെ പ്രധാന ഘടകങ്ങൾ

അതിന്റെ ലാളിത്യവും ഓൾ-ഇൻ-വൺ സ്വഭാവവും കാരണം, നമ്മുടെ ഉദാഹരണങ്ങൾക്കായി നമ്മൾ Jest ഉപയോഗിക്കും. "സീറോ-കോൺഫിഗറേഷൻ" അനുഭവം ആഗ്രഹിക്കുന്ന ടീമുകൾക്ക് ഇത് ഒരു മികച്ച തിരഞ്ഞെടുപ്പാണ്.

Jest ഉപയോഗിച്ച് ഘട്ടം ഘട്ടമായുള്ള സജ്ജീകരണം

TDD-ക്കായി ഒരു പുതിയ പ്രോജക്റ്റ് സജ്ജീകരിക്കാം.

1. നിങ്ങളുടെ പ്രോജക്റ്റ് ആരംഭിക്കുക: നിങ്ങളുടെ ടെർമിനൽ തുറന്ന് ഒരു പുതിയ പ്രോജക്റ്റ് ഡയറക്ടറി ഉണ്ടാക്കുക.

mkdir js-tdd-project
cd js-tdd-project
npm init -y

2. Jest ഇൻസ്റ്റാൾ ചെയ്യുക: Jest-നെ ഒരു ഡെവലപ്‌മെന്റ് ഡിപെൻഡൻസിയായി നിങ്ങളുടെ പ്രോജക്റ്റിലേക്ക് ചേർക്കുക.

npm install --save-dev jest

3. ടെസ്റ്റ് സ്ക്രിപ്റ്റ് കോൺഫിഗർ ചെയ്യുക: നിങ്ങളുടെ `package.json` ഫയൽ തുറക്കുക. `"scripts"` എന്ന ഭാഗം കണ്ടെത്തി `"test"` സ്ക്രിപ്റ്റ് മാറ്റിയെഴുതുക. TDD വർക്ക്ഫ്ലോയ്ക്ക് അമൂല്യമായ `"test:watch"` സ്ക്രിപ്റ്റ് ചേർക്കുന്നതും വളരെ ഉത്തമമാണ്.

"scripts": {
  "test": "jest",
  "test:watch": "jest --watchAll"
}

`--watchAll` എന്ന ഫ്ലാഗ് ഒരു ഫയൽ സേവ് ചെയ്യുമ്പോഴെല്ലാം ടെസ്റ്റുകൾ ഓട്ടോമാറ്റിക്കായി വീണ്ടും പ്രവർത്തിപ്പിക്കാൻ Jest-നോട് പറയുന്നു. ഇത് തൽക്ഷണ ഫീഡ്‌ബാക്ക് നൽകുന്നു, ഇത് റെഡ്-ഗ്രീൻ-റിഫാക്ടർ സൈക്കിളിന് തികച്ചും അനുയോജ്യമാണ്.

അത്രയേയുള്ളൂ! നിങ്ങളുടെ എൻവയോൺമെന്റ് തയ്യാറാണ്. `*.test.js`, `*.spec.js` എന്ന് പേരുള്ളതോ അല്ലെങ്കിൽ ഒരു `__tests__` ഡയറക്ടറിയിൽ സ്ഥിതിചെയ്യുന്നതോ ആയ ടെസ്റ്റ് ഫയലുകൾ Jest യാന്ത്രികമായി കണ്ടെത്തും.

TDD പ്രായോഗികമായി: ഒരു `CurrencyConverter` മൊഡ്യൂൾ നിർമ്മിക്കുന്നു

ആഗോളതലത്തിൽ മനസ്സിലാക്കാവുന്ന ഒരു പ്രായോഗിക പ്രശ്നത്തിന് TDD സൈക്കിൾ പ്രയോഗിക്കാം: കറൻസികൾക്കിടയിൽ പണം മാറ്റുന്നത്. നമ്മൾ ഒരു `CurrencyConverter` മൊഡ്യൂൾ ഘട്ടം ഘട്ടമായി നിർമ്മിക്കും.

ആവർത്തനം 1: ലളിതമായ, നിശ്ചിത നിരക്കിലുള്ള പരിവർത്തനം

🔴 ചുവപ്പ്: ആദ്യത്തെ പരാജയപ്പെടുന്ന ടെസ്റ്റ് എഴുതുക

ഒരു നിശ്ചിത നിരക്ക് ഉപയോഗിച്ച് ഒരു കറൻസിയിൽ നിന്ന് മറ്റൊന്നിലേക്ക് ഒരു നിശ്ചിത തുക മാറ്റുക എന്നതാണ് നമ്മുടെ ആദ്യത്തെ ആവശ്യം. `CurrencyConverter.test.js` എന്ന പേരിൽ ഒരു പുതിയ ഫയൽ ഉണ്ടാക്കുക.

// CurrencyConverter.test.js
const CurrencyConverter = require('./CurrencyConverter');

describe('CurrencyConverter', () => {
  it('ഒരു തുക USD-ൽ നിന്ന് EUR-ലേക്ക് ശരിയായി പരിവർത്തനം ചെയ്യണം', () => {
    // ക്രമീകരിക്കുക
    const amount = 10; // 10 USD
    const expected = 9.2; // 1 USD = 0.92 EUR എന്ന നിശ്ചിത നിരക്ക് അനുമാനിച്ച്

    // പ്രവർത്തിക്കുക
    const result = CurrencyConverter.convert(amount, 'USD', 'EUR');

    // ഉറപ്പുവരുത്തുക
    expect(result).toBe(expected);
  });
});

ഇപ്പോൾ, നിങ്ങളുടെ ടെർമിനലിൽ നിന്ന് ടെസ്റ്റ് വാച്ചർ പ്രവർത്തിപ്പിക്കുക:

npm run test:watch

ടെസ്റ്റ് കാര്യമായി പരാജയപ്പെടും. `TypeError: Cannot read properties of undefined (reading 'convert')` പോലൊന്ന് Jest റിപ്പോർട്ട് ചെയ്യും. ഇതാണ് നമ്മുടെ ചുവപ്പ് അവസ്ഥ. `CurrencyConverter` നിലവിലില്ലാത്തതിനാലാണ് ടെസ്റ്റ് പരാജയപ്പെടുന്നത്.

🟢 പച്ച: പാസാകാൻ ഏറ്റവും ലളിതമായ കോഡ് എഴുതുക

ഇനി, ടെസ്റ്റ് പാസാക്കാം. `CurrencyConverter.js` ഉണ്ടാക്കുക.

// CurrencyConverter.js
const rates = {
  USD: {
    EUR: 0.92
  }
};

const CurrencyConverter = {
  convert(amount, from, to) {
    return amount * rates[from][to];
  }
};

module.exports = CurrencyConverter;

ഈ ഫയൽ സേവ് ചെയ്താലുടൻ, Jest ടെസ്റ്റ് വീണ്ടും പ്രവർത്തിപ്പിക്കുകയും അത് പച്ചയായി മാറുകയും ചെയ്യും. ടെസ്റ്റിന്റെ ആവശ്യം നിറവേറ്റുന്നതിനായി നമ്മൾ ഏറ്റവും കുറഞ്ഞ കോഡ് എഴുതി.

🔵 റീഫാക്ടർ: കോഡ് മെച്ചപ്പെടുത്തുക

കോഡ് ലളിതമാണ്, പക്ഷേ നമുക്ക് ഇതിനകം മെച്ചപ്പെടുത്തലുകളെക്കുറിച്ച് ചിന്തിക്കാൻ തുടങ്ങാം. നെസ്റ്റഡ് `rates` ഒബ്ജക്റ്റ് അല്പം കർക്കശമാണ്. തൽക്കാലം, അത് വൃത്തിയുള്ളതാണ്. ഒരു ടെസ്റ്റിനാൽ സംരക്ഷിക്കപ്പെട്ട ഒരു വർക്കിംഗ് ഫീച്ചർ നമുക്കുണ്ട് എന്നതാണ് ഏറ്റവും പ്രധാനം. നമുക്ക് അടുത്ത ആവശ്യകതയിലേക്ക് പോകാം.

ആവർത്തനം 2: അജ്ഞാത കറൻസികൾ കൈകാര്യം ചെയ്യൽ

🔴 ചുവപ്പ്: അസാധുവായ ഒരു കറൻസിക്കായി ഒരു ടെസ്റ്റ് എഴുതുക

നമുക്കറിയാത്ത ഒരു കറൻസിയിലേക്ക് പരിവർത്തനം ചെയ്യാൻ ശ്രമിച്ചാൽ എന്ത് സംഭവിക്കണം? അത് ഒരു പിശക് കാണിക്കണം. `CurrencyConverter.test.js`-ലെ ഒരു പുതിയ ടെസ്റ്റിൽ ഈ സ്വഭാവം നിർവചിക്കാം.

// CurrencyConverter.test.js-ൽ, describe ബ്ലോക്കിനുള്ളിൽ

it('അജ്ഞാത കറൻസികൾക്ക് ഒരു പിശക് കാണിക്കണം', () => {
  // ക്രമീകരിക്കുക
  const amount = 10;

  // പ്രവർത്തിക്കുകയും ഉറപ്പുവരുത്തുകയും ചെയ്യുക
  // Jest-ന്റെ toThrow പ്രവർത്തിക്കുന്നതിനായി നമ്മൾ ഫംഗ്ഷൻ കോളിനെ ഒരു ആരോ ഫംഗ്ഷനിൽ പൊതിയുന്നു.
  expect(() => {
    CurrencyConverter.convert(amount, 'USD', 'XYZ');
  }).toThrow('Unknown currency: XYZ');
});

ഫയൽ സേവ് ചെയ്യുക. ടെസ്റ്റ് റണ്ണർ ഉടൻ തന്നെ ഒരു പുതിയ പരാജയം കാണിക്കുന്നു. നമ്മുടെ കോഡ് ഒരു പിശക് കാണിക്കാത്തതിനാലാണിത് ചുവപ്പ് ആകുന്നത്; അത് `rates['USD']['XYZ']` ആക്സസ് ചെയ്യാൻ ശ്രമിക്കുന്നു, ഇത് ഒരു `TypeError`-ന് കാരണമാകുന്നു. നമ്മുടെ പുതിയ ടെസ്റ്റ് ഈ പിഴവ് ശരിയായി തിരിച്ചറിഞ്ഞു.

🟢 പച്ച: പുതിയ ടെസ്റ്റ് പാസാക്കുക

പരിശോധന ചേർക്കാൻ `CurrencyConverter.js` മാറ്റിയെഴുതാം.

// CurrencyConverter.js
const rates = {
  USD: {
    EUR: 0.92,
    GBP: 0.80
  },
  EUR: {
    USD: 1.08
  }
};

const CurrencyConverter = {
  convert(amount, from, to) {
    if (!rates[from] || !rates[from][to]) {
      // മികച്ച പിശക് സന്ദേശത്തിനായി ഏത് കറൻസിയാണ് അജ്ഞാതമെന്ന് നിർണ്ണയിക്കുക
      const unknownCurrency = !rates[from] ? from : to;
      throw new Error(`Unknown currency: ${unknownCurrency}`);
    }
    return amount * rates[from][to];
  }
};

module.exports = CurrencyConverter;

ഫയൽ സേവ് ചെയ്യുക. രണ്ട് ടെസ്റ്റുകളും ഇപ്പോൾ പാസാകുന്നു. നമ്മൾ പച്ചയിലേക്ക് മടങ്ങിയെത്തി.

🔵 റീഫാക്ടർ: ഇത് വൃത്തിയാക്കുക

നമ്മുടെ `convert` ഫംഗ്ഷൻ വലുതാകുന്നു. മൂല്യനിർണ്ണയ ലോജിക് കണക്കുകൂട്ടലുമായി കലർന്നിരിക്കുന്നു. വായനാക്ഷമത മെച്ചപ്പെടുത്തുന്നതിനായി നമുക്ക് മൂല്യനിർണ്ണയത്തെ ഒരു പ്രത്യേക പ്രൈവറ്റ് ഫംഗ്ഷനിലേക്ക് മാറ്റാൻ കഴിയും, പക്ഷേ തൽക്കാലം ഇത് ഇപ്പോഴും കൈകാര്യം ചെയ്യാവുന്നതേയുള്ളൂ. നമ്മുടെ ടെസ്റ്റുകൾ എന്തെങ്കിലും തകരാറിലാക്കിയാൽ നമ്മളോട് പറയുമെന്നതുകൊണ്ട് ഈ മാറ്റങ്ങൾ വരുത്താനുള്ള സ്വാതന്ത്ര്യം നമുക്കുണ്ട് എന്നതാണ് പ്രധാനം.

ആവർത്തനം 3: അസിൻക്രണസ് റേറ്റ് ഫെച്ചിംഗ്

നിരക്കുകൾ ഹാർഡ്കോഡ് ചെയ്യുന്നത് യാഥാർത്ഥ്യമല്ല. ഒരു (മോക്ക് ചെയ്ത) എക്സ്റ്റേണൽ API-ൽ നിന്ന് നിരക്കുകൾ ലഭ്യമാക്കാൻ നമ്മുടെ മൊഡ്യൂൾ റീഫാക്ടർ ചെയ്യാം.

🔴 ചുവപ്പ്: ഒരു API കോൾ മോക്ക് ചെയ്യുന്ന ഒരു അസിൻക്രണസ് ടെസ്റ്റ് എഴുതുക

ആദ്യം, നമ്മുടെ കൺവെർട്ടർ പുനഃക്രമീകരിക്കേണ്ടതുണ്ട്. ഒരു API ക്ലയിന്റ് ഉപയോഗിച്ച് നമുക്ക് ഇൻസ്റ്റൻഷ്യേറ്റ് ചെയ്യാൻ കഴിയുന്ന ഒരു ക്ലാസ് ആയിരിക്കണം ഇത്. `fetch` API-യും മോക്ക് ചെയ്യേണ്ടതുണ്ട്. Jest ഇത് എളുപ്പമാക്കുന്നു.

ഈ പുതിയ, അസിൻക്രണസ് യാഥാർത്ഥ്യത്തിന് അനുയോജ്യമായ രീതിയിൽ നമ്മുടെ ടെസ്റ്റ് ഫയൽ മാറ്റിയെഴുതാം. നമ്മൾ വീണ്ടും ഹാപ്പി പാത്ത് ടെസ്റ്റ് ചെയ്തുകൊണ്ട് തുടങ്ങും.

// CurrencyConverter.test.js
const CurrencyConverter = require('./CurrencyConverter');

// എക്സ്റ്റേണൽ ഡിപൻഡൻസി മോക്ക് ചെയ്യുക
global.fetch = jest.fn();

beforeEach(() => {
  // ഓരോ ടെസ്റ്റിനും മുമ്പ് മോക്ക് ഹിസ്റ്ററി ക്ലിയർ ചെയ്യുക
  fetch.mockClear();
});

describe('CurrencyConverter', () => {
  it('നിരക്കുകൾ ലഭ്യമാക്കി ശരിയായി പരിവർത്തനം ചെയ്യണം', async () => {
    // ക്രമീകരിക്കുക
    // വിജയകരമായ API പ്രതികരണം മോക്ക് ചെയ്യുക
    fetch.mockResolvedValueOnce({
      json: () => Promise.resolve({ rates: { EUR: 0.92 } })
    });

    const converter = new CurrencyConverter('https://api.exchangerates.com');
    const amount = 10; // 10 USD

    // പ്രവർത്തിക്കുക
    const result = await converter.convert(amount, 'USD', 'EUR');

    // ഉറപ്പുവരുത്തുക
    expect(result).toBe(9.2);
    expect(fetch).toHaveBeenCalledTimes(1);
    expect(fetch).toHaveBeenCalledWith('https://api.exchangerates.com/latest?base=USD');
  });

  // API പരാജയങ്ങൾക്കും മറ്റും നമ്മൾ ടെസ്റ്റുകൾ ചേർക്കും.
});

ഇത് പ്രവർത്തിപ്പിക്കുന്നത് ഒരു വലിയ ചുവപ്പ് കടലിൽ കലാശിക്കും. നമ്മുടെ പഴയ `CurrencyConverter` ഒരു ക്ലാസല്ല, അതിന് ഒരു `async` മെത്തേഡ് ഇല്ല, അത് `fetch` ഉപയോഗിക്കുന്നില്ല.

🟢 പച്ച: അസിൻക്രണസ് ലോജിക് നടപ്പിലാക്കുക

ഇനി, ടെസ്റ്റിന്റെ ആവശ്യകതകൾ നിറവേറ്റുന്നതിനായി `CurrencyConverter.js` മാറ്റിയെഴുതാം.

// CurrencyConverter.js
class CurrencyConverter {
  constructor(apiUrl) {
    this.apiUrl = apiUrl;
  }

  async convert(amount, from, to) {
    const response = await fetch(`${this.apiUrl}/latest?base=${from}`);
    if (!response.ok) {
      throw new Error('വിനിമയ നിരക്കുകൾ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു.');
    }

    const data = await response.json();
    const rate = data.rates[to];

    if (!rate) {
      throw new Error(`അജ്ഞാത കറൻസി: ${to}`);
    }

    // ടെസ്റ്റുകളിലെ ഫ്ലോട്ടിംഗ് പോയിന്റ് പ്രശ്നങ്ങൾ ഒഴിവാക്കാൻ ലളിതമായ റൗണ്ടിംഗ്
    const convertedAmount = amount * rate;
    return parseFloat(convertedAmount.toFixed(2));
  }
}

module.exports = CurrencyConverter;

നിങ്ങൾ സേവ് ചെയ്യുമ്പോൾ, ടെസ്റ്റ് പച്ചയായി മാറണം. സാമ്പത്തിക കണക്കുകൂട്ടലുകളിലെ ഒരു സാധാരണ പ്രശ്നമായ ഫ്ലോട്ടിംഗ്-പോയിന്റ് പിഴവുകൾ കൈകാര്യം ചെയ്യുന്നതിനായി നമ്മൾ റൗണ്ടിംഗ് ലോജിക് ചേർത്തുവെന്നത് ശ്രദ്ധിക്കുക.

🔵 റീഫാക്ടർ: അസിൻക്രണസ് കോഡ് മെച്ചപ്പെടുത്തുക

`convert` മെത്തേഡ് ഒരുപാട് കാര്യങ്ങൾ ചെയ്യുന്നുണ്ട്: ഫെച്ചിംഗ്, പിശക് കൈകാര്യം ചെയ്യൽ, പാഴ്സിംഗ്, കണക്കുകൂട്ടൽ. API ആശയവിനിമയത്തിന് മാത്രം ഉത്തരവാദിത്തമുള്ള ഒരു പ്രത്യേക `RateFetcher` ക്ലാസ് ഉണ്ടാക്കി നമുക്കിത് റീഫാക്ടർ ചെയ്യാം. നമ്മുടെ `CurrencyConverter` പിന്നീട് ഈ ഫെച്ചർ ഉപയോഗിക്കും. ഇത് സിംഗിൾ റെസ്പോൺസിബിലിറ്റി പ്രിൻസിപ്പിൾ പിന്തുടരുകയും രണ്ട് ക്ലാസുകളും ടെസ്റ്റ് ചെയ്യാനും പരിപാലിക്കാനും എളുപ്പമാക്കുകയും ചെയ്യുന്നു. TDD നമ്മെ ഈ വൃത്തിയുള്ള ഡിസൈനിലേക്ക് നയിക്കുന്നു.

സാധാരണ TDD പാറ്റേണുകളും ആന്റി-പാറ്റേണുകളും

നിങ്ങൾ TDD പരിശീലിക്കുമ്പോൾ, നന്നായി പ്രവർത്തിക്കുന്ന പാറ്റേണുകളും തടസ്സങ്ങൾ സൃഷ്ടിക്കുന്ന ആന്റി-പാറ്റേണുകളും നിങ്ങൾ കണ്ടെത്തും.

പിന്തുടരേണ്ട നല്ല പാറ്റേണുകൾ

ഒഴിവാക്കേണ്ട ആന്റി-പാറ്റേണുകൾ

വിശാലമായ ഡെവലപ്‌മെന്റ് ലൈഫ് സൈക്കിളിൽ TDD

TDD ഒരു ശൂന്യതയിൽ നിലനിൽക്കുന്നില്ല. ഇത് ആധുനിക അജൈൽ, ഡെവ്ഓപ്സ് രീതികളുമായി, പ്രത്യേകിച്ച് ആഗോള ടീമുകൾക്ക്, മനോഹരമായി സംയോജിക്കുന്നു.

ഉപസംഹാരം: TDD-യോടൊപ്പമുള്ള നിങ്ങളുടെ യാത്ര

ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ് ഒരു ടെസ്റ്റിംഗ് തന്ത്രത്തേക്കാൾ ഉപരിയാണ്—ഇത് സോഫ്റ്റ്‌വെയർ ഡെവലപ്‌മെന്റിനെ സമീപിക്കുന്ന രീതിയിലെ ഒരു മാതൃകാപരമായ മാറ്റമാണ്. ഇത് ഗുണനിലവാരം, ആത്മവിശ്വാസം, സഹകരണം എന്നിവയുടെ ഒരു സംസ്കാരം വളർത്തുന്നു. റെഡ്-ഗ്രീൻ-റിഫാക്ടർ സൈക്കിൾ നിങ്ങളെ വൃത്തിയുള്ളതും കരുത്തുറ്റതും പരിപാലിക്കാൻ എളുപ്പമുള്ളതുമായ കോഡിലേക്ക് നയിക്കുന്ന ഒരു സ്ഥിരമായ താളം നൽകുന്നു. തത്ഫലമായുണ്ടാകുന്ന ടെസ്റ്റ് സ്യൂട്ട് നിങ്ങളുടെ ടീമിനെ റിഗ്രഷനുകളിൽ നിന്ന് സംരക്ഷിക്കുന്ന ഒരു സുരക്ഷാ വലയമായും പുതിയ അംഗങ്ങളെ ഓൺബോർഡ് ചെയ്യുന്ന ജീവിക്കുന്ന ഡോക്യുമെന്റേഷനായും മാറുന്നു.

പഠനവക്രം കുത്തനെയുള്ളതായി തോന്നാം, പ്രാരംഭ വേഗത കുറഞ്ഞതായും തോന്നാം. എന്നാൽ ഡീബഗ്ഗിംഗ് സമയം കുറയുന്നതിലും, മെച്ചപ്പെട്ട സോഫ്റ്റ്‌വെയർ ഡിസൈനിലും, വർദ്ധിച്ച ഡെവലപ്പർ ആത്മവിശ്വാസത്തിലുമുള്ള ദീർഘകാല നേട്ടങ്ങൾ അളവറ്റതാണ്. TDD-യിൽ വൈദഗ്ദ്ധ്യം നേടാനുള്ള യാത്ര അച്ചടക്കത്തിന്റെയും പരിശീലനത്തിന്റെയും ഒന്നാണ്.

ഇന്നുതന്നെ ആരംഭിക്കുക. നിങ്ങളുടെ അടുത്ത പ്രോജക്റ്റിലെ ചെറുതും പ്രാധാന്യം കുറഞ്ഞതുമായ ഒരു ഫീച്ചർ തിരഞ്ഞെടുത്ത് പ്രക്രിയയിൽ പ്രതിജ്ഞാബദ്ധരാകുക. ആദ്യം ടെസ്റ്റ് എഴുതുക. അത് പരാജയപ്പെടുന്നത് കാണുക. അത് പാസാക്കുക. എന്നിട്ട്, ഏറ്റവും പ്രധാനമായി, റീഫാക്ടർ ചെയ്യുക. ഒരു പച്ച ടെസ്റ്റ് സ്യൂട്ടിൽ നിന്ന് വരുന്ന ആത്മവിശ്വാസം അനുഭവിക്കുക, നിങ്ങൾ എങ്ങനെയാണ് മുമ്പ് മറ്റൊരു രീതിയിൽ സോഫ്റ്റ്‌വെയർ നിർമ്മിച്ചതെന്ന് നിങ്ങൾ ഉടൻ അത്ഭുതപ്പെടും.

ജാവാസ്ക്രിപ്റ്റിലെ ടെസ്റ്റ്-ഡ്രിവൺ ഡെവലപ്‌മെന്റ്: ആഗോള ഡെവലപ്പർമാർക്കുള്ള ഒരു സമഗ്ര ഗൈഡ് | MLOG