পাঠ ০৫ · ৫৭-এর মধ্যে · মডিউল ২
Home / Courses / Software Testing & Quality Assurance / ইকুইভ্যালেন্স পার্টিশনিং

ইকুইভ্যালেন্স পার্টিশনিং

Equivalence partitioning
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ইকুইভ্যালেন্স পার্টিশনিং-এর সংজ্ঞা এবং এটি কেন টেস্ট কেসের সংখ্যা কমিয়ে আনে
  • একটি স্পেসিফিকেশন থেকে ভ্যালিড ও ইনভ্যালিড পার্টিশন কীভাবে চিহ্নিত করতে হয়
  • প্রতিটি পার্টিশন থেকে একটি প্রতিনিধি মান বাছাইয়ের নিয়ম
  • Python-এর unittest দিয়ে একটি সত্যিকারের, চলমান পার্টিশন-ভিত্তিক টেস্ট স্যুট

১ · ইকুইভ্যালেন্স পার্টিশনিং কী

ইকুইভ্যালেন্স পার্টিশনিংEquivalence Partitioningএকটি ইনপুট ডোমেইনকে এমন কয়েকটি গ্রুপে ভাগ করা যেখানে একই গ্রুপের যেকোনো মান প্রোগ্রামকে একই ধরনের আচরণ করাবে বলে ধরে নেওয়া হয় — তারপর প্রতিটি গ্রুপ থেকে মাত্র একটি প্রতিনিধি মান টেস্ট করা হয়। ধরুন একটি ফাংশন বলছে "বয়স ১৮ থেকে ৬৫ হলে ডিসকাউন্টের জন্য যোগ্য"। এই স্পেসিফিকেশন থেকে তিনটি স্বাভাবিক গ্রুপ বেরিয়ে আসে — ১৮-এর কম (অযোগ্য), ১৮ থেকে ৬৫ (যোগ্য), এবং ৬৫-এর বেশি (অযোগ্য)। প্রতিটি গ্রুপের ভেতরের সব মান প্রোগ্রামকে একইভাবে আচরণ করাবে বলে যুক্তিসঙ্গতভাবে ধরে নেওয়া যায় — তাই বয়স=5 আর বয়স=15 আলাদা করে টেস্ট করার দরকার নেই, দুটোই "১৮-এর কম" পার্টিশনের অংশ।

ইনভ্যালিড-লো বয়স < ১৮ · প্রতিনিধি: ১০ ভ্যালিড ১৮ – ৬৫ · প্রতিনিধি: ৪০ ইনভ্যালিড-হাই বয়স > ৬৫ · প্রতিনিধি: ৭০
তিনটি পার্টিশন থেকে মাত্র তিনটি প্রতিনিধি মান (১০, ৪০, ৭০) টেস্ট করলেই পুরো বয়স-রেঞ্জের আচরণ যাচাই হয়ে যায় — অসীম সংখ্যক সম্ভাব্য বয়স মান টেস্ট করার দরকার নেই।

২ · কেন পুরো রেঞ্জ টেস্ট করার দরকার নেই

একই আচরণের অনুমান
একই পার্টিশনের ভেতরের সব মান কোডের একই শাখা (branch) দিয়ে প্রসেস হয় বলে ধরে নেওয়া হয় — তাই একটি প্রতিনিধি মানের ফলাফলই পুরো পার্টিশনের প্রতিনিধিত্ব করে।
কম টেস্ট, একই আস্থা
অসীম সংখ্যক সম্ভাব্য ইনপুটের বদলে হাতে গোনা কয়েকটি প্রতিনিধি মান টেস্ট করেই যুক্তিসঙ্গত কভারেজ পাওয়া যায় — সময় ও রিসোর্স দুটোই বাঁচে।
সীমাবদ্ধতা
এই টেকনিক পার্টিশনের "মাঝামাঝি" মান নিয়ে কাজ করে — পার্টিশনের ঠিক কিনারায় থাকা মান (যেমন ঠিক ১৮ বা ঠিক ৬৫) পরীক্ষা করতে হলে পরের পাঠের বাউন্ডারি ভ্যালু অ্যানালাইসিস লাগবে।

৩ · ধাপে ধাপে পার্টিশন বানানোর পদ্ধতি

প্রথমে স্পেসিফিকেশন থেকে ভ্যালিড ও ইনভ্যালিড রেঞ্জ চিহ্নিত করতে হয় (এখানে: ভ্যালিড = ১৮–৬৫, ইনভ্যালিড = তার বাইরের সবকিছু)। তারপর প্রতিটি রেঞ্জকে একটি নাম ও একটি প্রতিনিধি মান দিয়ে প্রোগ্রাম্যাটিকভাবে সংজ্ঞায়িত করা হয় — নিচের কোড সেলে এটি একটি সাধারণ Python dict-এর তালিকা হিসেবে লেখা হয়েছে, যাতে নতুন পার্টিশন যোগ করা বা রেঞ্জ পরিবর্তন করা সহজ থাকে।

Python
import unittest

def is_eligible_for_discount(age):
    # স্পেসিফিকেশন: বয়স 18 থেকে 65 (দুই প্রান্ত সহ) হলে ডিসকাউন্টের জন্য যোগ্য
    return 18 <= age <= 65

# স্পেসিফিকেশন থেকে প্রোগ্রাম্যাটিকভাবে তৈরি ইকুইভ্যালেন্স পার্টিশন —
# প্রতিটি পার্টিশন থেকে একটি প্রতিনিধি মান বাছাই করলেই যথেষ্ট, পুরো রেঞ্জ টেস্ট করার দরকার নেই
PARTITIONS = [
    {"name": "invalid_low",  "desc": "১৮-এর কম (অযোগ্য)",  "representative": 10, "expected": False},
    {"name": "valid",        "desc": "১৮ থেকে ৬৫ (যোগ্য)",  "representative": 40, "expected": True},
    {"name": "invalid_high", "desc": "৬৫-এর বেশি (অযোগ্য)", "representative": 70, "expected": False},
]

print("পার্টিশন-ভিত্তিক যাচাই:")
for p in PARTITIONS:
    actual = is_eligible_for_discount(p["representative"])
    status = "PASS" if actual == p["expected"] else "FAIL"
    print(f"  [{status}] {p['name']} -- বয়স={p['representative']} ({p['desc']}) "
          f"প্রত্যাশিত={p['expected']} পেয়েছে={actual}")

class EquivalencePartitionTests(unittest.TestCase):
    def test_invalid_low_partition(self):
        self.assertFalse(is_eligible_for_discount(10))

    def test_valid_partition(self):
        self.assertTrue(is_eligible_for_discount(40))

    def test_invalid_high_partition(self):
        self.assertFalse(is_eligible_for_discount(70))

suite = unittest.TestLoader().loadTestsFromTestCase(EquivalencePartitionTests)
unittest.TextTestRunner(verbosity=2).run(suite)

    
লক্ষ্য করুন PARTITIONS তালিকাটি স্পেসিফিকেশনের সাথে সরাসরি যুক্ত — যদি ভবিষ্যতে বয়স-রেঞ্জ পরিবর্তন হয় (ধরুন ৬৫-এর বদলে ৭০ হলো), শুধু এই তালিকার সংখ্যাগুলো বদলালেই টেস্ট আপডেট হয়ে যায়, পুরো টেস্ট কোড নতুন করে লিখতে হয় না। তিনটি unittest টেস্টই পাস করে, কারণ ফাংশনটি স্পেসিফিকেশন অনুযায়ী সঠিকভাবেই লেখা — পরের পাঠে দেখব একই ধরনের ফাংশনে একটি সূক্ষ্ম বাগ কীভাবে থেকে যেতে পারে যা ইকুইভ্যালেন্স পার্টিশনিং ধরতে পারে না, কিন্তু বাউন্ডারি ভ্যালু অ্যানালাইসিস ঠিকই ধরে ফেলে।
মূল কথা · Key takeaway

ইকুইভ্যালেন্স পার্টিশনিং টেস্ট ডিজাইনের প্রথম ধাপ — এলোমেলো ইনপুট বাছাই না করে, স্পেসিফিকেশনকে যুক্তিসঙ্গত গ্রুপে ভাগ করে প্রতিটি গ্রুপ থেকে একটি প্রতিনিধি মান বাছাই করা। এটি টেস্ট কেসের সংখ্যা ব্যবহারিকভাবে সম্ভব রাখে, তবে গ্রুপের কিনারায় থাকা মানগুলোর জন্য এটি যথেষ্ট নয় — সেই কাজটি পরের পাঠে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একই পার্টিশনের ভেতরে যেকোনো মান বাছাই করলে কি ফলাফল সবসময় একই রকম হবে বলে নিশ্চিত?

না, এটি একটি অনুমান (assumption), গ্যারান্টি নয়। ইকুইভ্যালেন্স পার্টিশনিং ধরে নেয় কোডের গঠন স্পেসিফিকেশনের গ্রুপগুলোর সাথে মিলে যায় — কিন্তু বাস্তব কোডে এমন লুকানো "কিনারা" বা এজ কেস থাকতে পারে যা এই অনুমানকে ভুল প্রমাণ করে। এই কারণেই ইকুইভ্যালেন্স পার্টিশনিং একা যথেষ্ট নয় — বাউন্ডারি ভ্যালু অ্যানালাইসিসের মতো টেকনিক দিয়ে এই ফাঁক পূরণ করা হয়।

প্র ০২ উপরের কোড সেলে invalid_low পার্টিশনের প্রতিনিধি মান হিসেবে 10-এর বদলে -5 বা 0 বাছাই করলে কি ফলাফল পাল্টাত?

না — -5, 0, এবং 10 সবগুলোই "১৮-এর কম" পার্টিশনের অংশ, তাই is_eligible_for_discount সবগুলোর জন্যই False রিটার্ন করবে। ইকুইভ্যালেন্স পার্টিশনিং-এর মূল ধারণাই এটি — একই পার্টিশনের ভেতর কোন নির্দিষ্ট মান বাছাই করা হলো তা গুরুত্বপূর্ণ নয়, গুরুত্বপূর্ণ হলো প্রতিটি পার্টিশন থেকে অন্তত একটি মান বাছাই করা হয়েছে কি না।

প্র ০৩ যদি একটি ফাংশন দুইটির বদলে তিনটি স্বতন্ত্র শর্তে ভিন্ন আচরণ করে (যেমন "স্টুডেন্ট", "সাধারণ", এবং "সিনিয়র সিটিজেন" — তিন ধরনের ডিসকাউন্ট রেট), পার্টিশনের সংখ্যা কীভাবে বদলাবে?

তখন PARTITIONS তালিকায় প্রতিটি ভিন্ন-আচরণ-করা গ্রুপের জন্য একটি করে এন্ট্রি যোগ করতে হবে — যেমন তিনটি বয়স-রেঞ্জের জন্য তিনটি ভ্যালিড পার্টিশন, প্লাস অযোগ্য রেঞ্জের জন্য প্রয়োজনমতো ইনভ্যালিড পার্টিশন। মূলনীতি একই থাকে: যতগুলো স্বতন্ত্র আচরণ, ততগুলো পার্টিশন — শুধু সংখ্যা বাড়ে।

অনুশীলন

  1. চিন্তা করুন: একটি ফাংশন আছে যা পাসওয়ার্ডের দৈর্ঘ্য ৮ থেকে ২০ অক্ষরের মধ্যে হলে "ভ্যালিড" বলে গণ্য করে। এর জন্য কয়টি পার্টিশন হবে, এবং প্রতিটির জন্য কী প্রতিনিধি মান বাছাই করবেন?

    তিনটি পার্টিশন: ৮-এর কম দৈর্ঘ্য (ইনভ্যালিড, প্রতিনিধি হতে পারে ৩ অক্ষর), ৮ থেকে ২০ দৈর্ঘ্য (ভ্যালিড, প্রতিনিধি হতে পারে ১২ অক্ষর), এবং ২০-এর বেশি দৈর্ঘ্য (ইনভ্যালিড, প্রতিনিধি হতে পারে ৩০ অক্ষর) — ঠিক উপরের বয়স-উদাহরণের মতোই গঠন।

  2. পরীক্ষা করুন: উপরের কোড সেলে PARTITIONS তালিকায় একটি নতুন এন্ট্রি যোগ করুন — {"name": "boundary_low", "desc": "ঠিক ১৮", "representative": 18, "expected": True} — এবং Run চেপে দেখুন এটিও পাস করে কি না।

    হ্যাঁ, এটিও পাস করবে, কারণ 18 <= 18 <= 65 সত্য। কিন্তু লক্ষ্য করুন — এই একটি এন্ট্রি দিয়ে "ঠিক কিনারায়" কী হয় তা নিশ্চিত হওয়া যায় না, কারণ ইকুইভ্যালেন্স পার্টিশনিং নিজে থেকে কিনারার মান খুঁজে বের করার কোনো নিয়মতান্ত্রিক পদ্ধতি দেয় না — এটাই পরের পাঠের বিষয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
সফটওয়্যার টেস্টিং-এর সাতটি মূলনীতি