চারটি সাধারণ ধরনের কোড কভারেজ

কোড কভারেজ কী তা জানুন এবং এটি পরিমাপ করার চারটি সাধারণ উপায় আবিষ্কার করুন।

আপনি কি "কোড কভারেজ" শব্দটি শুনেছেন? এই পোস্টে, আমরা পরীক্ষায় কোড কভারেজ কী এবং এটি পরিমাপ করার চারটি সাধারণ উপায় অন্বেষণ করব।

কোড কভারেজ কি?

কোড কভারেজ হল একটি মেট্রিক যা আপনার পরীক্ষা চালানোর উৎস কোডের শতাংশ পরিমাপ করে। এটি আপনাকে এমন ক্ষেত্রগুলি সনাক্ত করতে সহায়তা করে যেখানে সঠিক পরীক্ষার অভাব থাকতে পারে।

প্রায়ই, এই মেট্রিক্স রেকর্ড করা এই মত দেখায়:

ফাইল % বিবৃতি % শাখা % ফাংশন % লাইন অনাবৃত লাইন
file.js 90% 100% 90% 80% 89,256
coffee.js 55.55% 80% ৫০% 62.5% 10-11, 18

আপনি নতুন বৈশিষ্ট্য এবং পরীক্ষা যোগ করার সাথে সাথে, কোড কভারেজ শতাংশ বৃদ্ধি আপনাকে আরও আত্মবিশ্বাস দিতে পারে যে আপনার অ্যাপ্লিকেশনটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করা হয়েছে। যাইহোক, আরো আবিষ্কার আছে.

চারটি সাধারণ ধরনের কোড কভারেজ

কোড কভারেজ সংগ্রহ এবং গণনা করার চারটি সাধারণ উপায় রয়েছে: ফাংশন, লাইন, শাখা এবং বিবৃতি কভারেজ।

টেক্সট কভারেজ চার ধরনের.

প্রতিটি ধরনের কোড কভারেজ কীভাবে তার শতাংশ গণনা করে তা দেখতে, কফি উপাদান গণনার জন্য নিম্নলিখিত কোড উদাহরণ বিবেচনা করুন:

/* coffee.js */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  let espresso, water;

  if (coffeeName === 'espresso') {
    espresso = 30 * cup;
    return { espresso };
  }

  if (coffeeName === 'americano') {
    espresso = 30 * cup; water = 70 * cup;
    return { espresso, water };
  }

  return {};
}

export function isValidCoffee(name) {
  return ['espresso', 'americano', 'mocha'].includes(name);
}

যে পরীক্ষাগুলি calcCoffeeIngredient ফাংশন যাচাই করে তা হল:

/* coffee.test.js */

import { describe, expect, assert, it } from 'vitest';
import { calcCoffeeIngredient } from '../src/coffee-incomplete';

describe('Coffee', () => {
  it('should have espresso', () => {
    const result = calcCoffeeIngredient('espresso', 2);
    expect(result).to.deep.equal({ espresso: 60 });
  });

  it('should have nothing', () => {
    const result = calcCoffeeIngredient('unknown');
    expect(result).to.deep.equal({});
  });
});

আপনি এই লাইভ ডেমোতে কোড এবং পরীক্ষা চালাতে পারেন বা সংগ্রহস্থলটি পরীক্ষা করে দেখতে পারেন।

ফাংশন কভারেজ

কোড কভারেজ: 50%

/* coffee.js */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  // ...
}

function isValidCoffee(name) {
  // ...
}

ফাংশন কভারেজ একটি সহজবোধ্য মেট্রিক। এটি আপনার কোডের ফাংশনগুলির শতাংশ ক্যাপচার করে যা আপনার পরীক্ষাগুলি কল করে।

কোড উদাহরণে, দুটি ফাংশন আছে: calcCoffeeIngredient এবং isValidCoffee । পরীক্ষাগুলি শুধুমাত্র calcCoffeeIngredient ফাংশনকে কল করে, তাই ফাংশন কভারেজ 50%।

লাইন কভারেজ

কোড কভারেজ: 62.5%

/* coffee.js */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  let espresso, water;

  if (coffeeName === 'espresso') {
    espresso = 30 * cup;
    return { espresso };
  }

  if (coffeeName === 'americano') {
    espresso = 30 * cup; water = 70 * cup;
    return { espresso, water };
  }

  return {};
}

export function isValidCoffee(name) {
  return ['espresso', 'americano', 'mocha'].includes(name);
}

লাইন কভারেজ এক্সিকিউটেবল কোড লাইনের শতকরা পরিমাপ করে যা আপনার টেস্ট স্যুট এক্সিকিউট করেছে। যদি কোডের একটি লাইন কার্যকর না হয়, তাহলে এর অর্থ হল কোডের কিছু অংশ পরীক্ষা করা হয়নি।

কোড উদাহরণে এক্সিকিউটেবল কোডের আটটি লাইন রয়েছে (লাল এবং সবুজ রঙে হাইলাইট করা হয়েছে) কিন্তু পরীক্ষাগুলি americano অবস্থা (দুটি লাইন) এবং isValidCoffee ফাংশন (এক লাইন) কার্যকর করে না। এর ফলে 62.5% লাইন কভারেজ হয়।

মনে রাখবেন যে লাইন কভারেজ ঘোষণার বিবৃতিগুলিকে বিবেচনা করে না, যেমন function isValidCoffee(name) এবং let espresso, water; , কারণ তারা নির্বাহযোগ্য নয়।

শাখা কভারেজ

কোড কভারেজ: 80%

/* coffee.js */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  // ...

  if (coffeeName === 'espresso') {
    // ...
    return { espresso };
  }

  if (coffeeName === 'americano') {
    // ...
    return { espresso, water };
  }

  return {};
}
…

শাখা কভারেজ কোডে কার্যকর করা শাখা বা সিদ্ধান্তের পয়েন্টের শতাংশ পরিমাপ করে, যেমন যদি বিবৃতি বা লুপ। এটি নির্ধারণ করে যে পরীক্ষাগুলি শর্তসাপেক্ষ বিবৃতির সত্য এবং মিথ্যা উভয় শাখা পরীক্ষা করে কিনা।

কোড উদাহরণে পাঁচটি শাখা রয়েছে:

  1. শুধু coffeeName দিয়ে calcCoffeeIngredient কল করা হচ্ছে চেক চিহ্ন।
  2. coffeeName এবং cup সাথে calcCoffeeIngredient কল করা হচ্ছে চেক চিহ্ন।
  3. কফি হচ্ছে এসপ্রেসো চেক চিহ্ন।
  4. কফি আমেরিকান এক্স চিহ্ন।
  5. অন্যান্য কফি চেক চিহ্ন।

Coffee is Americano কন্ডিশন ছাড়া সমস্ত শাখা কভার করে। সুতরাং শাখা কভারেজ 80%।

বিবৃতি কভারেজ

কোড কভারেজ: 55.55%

/* coffee.js */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  let espresso, water;

  if (coffeeName === 'espresso') {
    espresso = 30 * cup;
    return { espresso };
  }

  if (coffeeName === 'americano') {
    espresso = 30 * cup; water = 70 * cup;
    return { espresso, water };
  }

  return {};
}

export function isValidCoffee(name) {
  return ['espresso', 'americano', 'mocha'].includes(name);
}

বিবৃতি কভারেজ আপনার কোডের বিবৃতির শতাংশ পরিমাপ করে যা আপনার পরীক্ষাগুলি কার্যকর করে। প্রথম নজরে, আপনি ভাবতে পারেন, "এটি কি লাইন কভারেজের মতো নয়?" প্রকৃতপক্ষে, বিবৃতি কভারেজ লাইন কভারেজের অনুরূপ কিন্তু একাধিক বিবৃতি ধারণ করে এমন কোডের একক লাইন বিবেচনা করে।

কোড উদাহরণে, এক্সিকিউটেবল কোডের আটটি লাইন আছে, কিন্তু নয়টি বিবৃতি আছে। আপনি দুটি বিবৃতি ধারণকারী লাইন স্পট করতে পারেন?

আপনার উত্তর চেক

এটি নিম্নলিখিত লাইন: espresso = 30 * cup; water = 70 * cup;

পরীক্ষা নয়টি বিবৃতির মধ্যে মাত্র পাঁচটি কভার করে, তাই বিবৃতি কভারেজ 55.55%।

আপনি যদি প্রতি লাইনে একটি বিবৃতি লেখেন, তাহলে আপনার লাইন কভারেজ আপনার বিবৃতি কভারেজের মতোই হবে।

আপনি কি ধরনের কোড কভারেজ নির্বাচন করা উচিত?

বেশিরভাগ কোড কভারেজ টুল এই চার ধরনের সাধারণ কোড কভারেজ অন্তর্ভুক্ত করে। কোন কোড কভারেজ মেট্রিককে অগ্রাধিকার দিতে হবে তা নির্বাচন করা নির্দিষ্ট প্রকল্পের প্রয়োজনীয়তা, উন্নয়ন অনুশীলন এবং পরীক্ষার লক্ষ্যগুলির উপর নির্ভর করে।

সাধারণভাবে, বিবৃতি কভারেজ একটি ভাল সূচনা পয়েন্ট কারণ এটি একটি সহজ এবং সহজে বোঝার মেট্রিক। স্টেটমেন্ট কভারেজের বিপরীতে, শাখা কভারেজ এবং ফাংশন কভারেজ পরিমাপ করে যে পরীক্ষাগুলি একটি শর্ত (শাখা) বা একটি ফাংশন বলে কিনা। অতএব, তারা বিবৃতি কভারেজ পরে একটি স্বাভাবিক অগ্রগতি হয়.

একবার আপনি উচ্চ বিবৃতি কভারেজ অর্জন করলে, আপনি তারপর শাখা কভারেজ এবং ফাংশন কভারেজের দিকে যেতে পারেন।

পরীক্ষার কভারেজ কি কোড কভারেজের মতো?

না। টেস্ট কভারেজ এবং কোড কভারেজ প্রায়ই বিভ্রান্ত হয় কিন্তু সেগুলি আলাদা:

  • পরীক্ষার কভারেজ : গুণগত মেট্রিক যা পরিমাপ করে যে পরীক্ষা স্যুটটি সফ্টওয়্যারের বৈশিষ্ট্যগুলিকে কতটা ভালভাবে কভার করে। এটি জড়িত ঝুঁকির মাত্রা নির্ধারণ করতে সাহায্য করে।
  • কোড কভারেজ : একটি পরিমাণগত মেট্রিক যা পরীক্ষার সময় কার্যকর করা কোডের অনুপাত পরিমাপ করে। এটা পরীক্ষা কভার কত কোড সম্পর্কে.

এখানে একটি সরলীকৃত সাদৃশ্য রয়েছে: একটি ওয়েব অ্যাপ্লিকেশনকে একটি ঘর হিসাবে কল্পনা করুন৷

  • পরীক্ষার কভারেজ পরিমাপ করে যে পরীক্ষাগুলি বাড়ির কক্ষগুলিকে কতটা ভালভাবে কভার করে।
  • কোড কভারেজ পরিমাপ করে যে ঘরের কতটা পরীক্ষা হয়েছে।

100% কোড কভারেজ মানে কোন বাগ নেই

যদিও পরীক্ষায় উচ্চ কোড কভারেজ অর্জন করা অবশ্যই বাঞ্ছনীয়, 100% কোড কভারেজ আপনার কোডে বাগ বা ত্রুটিগুলির অনুপস্থিতির গ্যারান্টি দেয় না।

100% কোড কভারেজ অর্জন করার একটি অর্থহীন উপায়

নিম্নলিখিত পরীক্ষা বিবেচনা করুন:

/* coffee.test.js */

// ...
describe('Warning: Do not do this', () => {
  it('is meaningless', () => { 
    calcCoffeeIngredient('espresso', 2);
    calcCoffeeIngredient('americano');
    calcCoffeeIngredient('unknown');
    isValidCoffee('mocha');
    expect(true).toBe(true); // not meaningful assertion
  });
});

এই পরীক্ষাটি 100% ফাংশন, লাইন, শাখা এবং বিবৃতি কভারেজ অর্জন করে, কিন্তু এটির অর্থ হয় না কারণ এটি আসলে কোডটি পরীক্ষা করে না। কোড সঠিকভাবে কাজ করছে কিনা তা বিবেচনা না করেই expect(true).toBe(true) .

একটি খারাপ মেট্রিক কোন মেট্রিকের চেয়ে খারাপ

একটি খারাপ মেট্রিক আপনাকে নিরাপত্তার একটি মিথ্যা ধারণা দিতে পারে, যা কোনও মেট্রিক না থাকার চেয়েও খারাপ। উদাহরণস্বরূপ, যদি আপনার একটি পরীক্ষা স্যুট থাকে যা 100% কোড কভারেজ অর্জন করে কিন্তু পরীক্ষাগুলি সব অর্থহীন হয়, তাহলে আপনি নিরাপত্তার একটি মিথ্যা ধারণা পেতে পারেন যে আপনার কোডটি ভালভাবে পরীক্ষা করা হয়েছে। আপনি যদি ভুলবশত অ্যাপ্লিকেশন কোডের একটি অংশ মুছে ফেলেন বা ভাঙেন, তবে পরীক্ষাগুলি পাস হবে, যদিও অ্যাপ্লিকেশনটি আর সঠিকভাবে কাজ করে না।

এই দৃশ্যকল্প এড়াতে:

  • পরীক্ষা পর্যালোচনা। পরীক্ষাগুলি লিখুন এবং পর্যালোচনা করুন নিশ্চিত করুন যে সেগুলি অর্থপূর্ণ এবং বিভিন্ন পরিস্থিতিতে কোড পরীক্ষা করুন।
  • কোড কভারেজ একটি নির্দেশিকা হিসাবে ব্যবহার করুন , পরীক্ষার কার্যকারিতা বা কোড মানের একমাত্র পরিমাপ হিসাবে নয়।

বিভিন্ন ধরনের পরীক্ষায় কোড কভারেজ ব্যবহার করা

আসুন তিনটি সাধারণ ধরণের পরীক্ষার সাথে আপনি কীভাবে কোড কভারেজ ব্যবহার করতে পারেন তা ঘনিষ্ঠভাবে দেখে নেওয়া যাক:

  • ইউনিট পরীক্ষা। এগুলি কোড কভারেজ সংগ্রহের জন্য সর্বোত্তম পরীক্ষার ধরন কারণ এগুলি একাধিক ছোট পরিস্থিতি এবং পরীক্ষার পথগুলি কভার করার জন্য ডিজাইন করা হয়েছে৷
  • ইন্টিগ্রেশন পরীক্ষা। তারা ইন্টিগ্রেশন পরীক্ষার জন্য কোড কভারেজ সংগ্রহ করতে সাহায্য করতে পারে, কিন্তু সতর্কতার সাথে ব্যবহার করুন। এই ক্ষেত্রে, আপনি সোর্স কোডের একটি বৃহত্তর অংশের কভারেজ গণনা করেন এবং কোন পরীক্ষাগুলি আসলে কোডের কোন অংশগুলিকে কভার করে তা নির্ধারণ করা কঠিন হতে পারে। যাইহোক, ইন্টিগ্রেশন পরীক্ষার কোড কভারেজ গণনা করা এমন লিগ্যাসি সিস্টেমের জন্য উপযোগী হতে পারে যেগুলিতে ভালভাবে বিচ্ছিন্ন ইউনিট নেই।
  • এন্ড-টু-এন্ড (E2E) পরীক্ষা। এই পরীক্ষার জটিল প্রকৃতির কারণে E2E পরীক্ষার জন্য কোড কভারেজ পরিমাপ করা কঠিন এবং চ্যালেঞ্জিং। কোড কভারেজ ব্যবহার করার পরিবর্তে, প্রয়োজনীয় কভারেজ যেতে পারে ভাল উপায়। এর কারণ হল E2E পরীক্ষার ফোকাস হল আপনার পরীক্ষার প্রয়োজনীয়তাগুলি কভার করা, সোর্স কোডের উপর ফোকাস করা নয়।

উপসংহার

কোড কভারেজ আপনার পরীক্ষার কার্যকারিতা পরিমাপের জন্য একটি দরকারী মেট্রিক হতে পারে। আপনার কোডের গুরুত্বপূর্ণ যুক্তিটি ভালভাবে পরীক্ষা করা হয়েছে তা নিশ্চিত করে এটি আপনাকে আপনার অ্যাপ্লিকেশনের গুণমান উন্নত করতে সাহায্য করতে পারে।

যাইহোক, মনে রাখবেন যে কোড কভারেজ শুধুমাত্র একটি মেট্রিক। আপনার পরীক্ষার গুণমান এবং আপনার আবেদনের প্রয়োজনীয়তার মতো অন্যান্য বিষয়গুলিও বিবেচনা করা নিশ্চিত করুন।

100% কোড কভারেজের জন্য লক্ষ্য করা লক্ষ্য নয়। পরিবর্তে, আপনার একটি সু-বৃত্তাকার পরীক্ষার পরিকল্পনার সাথে কোড কভারেজ ব্যবহার করা উচিত যা ইউনিট পরীক্ষা, ইন্টিগ্রেশন পরীক্ষা, এন্ড-টু-এন্ড পরীক্ষা এবং ম্যানুয়াল পরীক্ষা সহ বিভিন্ন পরীক্ষার পদ্ধতি অন্তর্ভুক্ত করে।

ভাল কোড কভারেজ সহ সম্পূর্ণ কোড উদাহরণ এবং পরীক্ষা দেখুন। আপনি এই লাইভ ডেমো দিয়ে কোড এবং পরীক্ষা চালাতে পারেন।

/* coffee.js - a complete example */

export function calcCoffeeIngredient(coffeeName, cup = 1) {
  if (!isValidCoffee(coffeeName)) return {};

  let espresso, water;

  if (coffeeName === 'espresso') {
    espresso = 30 * cup;
    return { espresso };
  }

  if (coffeeName === 'americano') {
    espresso = 30 * cup; water = 70 * cup;
    return { espresso, water };
  }

  throw new Error (`${coffeeName} not found`);
}

function isValidCoffee(name) {
  return ['espresso', 'americano', 'mocha'].includes(name);
}
/* coffee.test.js - a complete test suite */

import { describe, expect, it } from 'vitest';
import { calcCoffeeIngredient } from '../src/coffee-complete';

describe('Coffee', () => {
  it('should have espresso', () => {
    const result = calcCoffeeIngredient('espresso', 2);
    expect(result).to.deep.equal({ espresso: 60 });
  });

  it('should have americano', () => {
    const result = calcCoffeeIngredient('americano');
    expect(result.espresso).to.equal(30);
    expect(result.water).to.equal(70);
  });

  it('should throw error', () => {
    const func = () => calcCoffeeIngredient('mocha');
    expect(func).toThrowError(new Error('mocha not found'));
  });

  it('should have nothing', () => {
    const result = calcCoffeeIngredient('unknown')
    expect(result).to.deep.equal({});
  });
});