Property-Based Testing এর জন্য QuickCheck

Testing in Haskell (টেস্টিং) - হ্যাস্কেল (Haskell) - Computer Programming

425

Haskell এ Property-Based Testing এর জন্য QuickCheck

Haskell এ Property-Based Testing একটি পদ্ধতি যেখানে টেস্ট করা হয়, আপনার প্রোগ্রাম বা ফাংশন কোনো নির্দিষ্ট গুণাবলী (properties) পূরণ করছে কিনা। এখানে QuickCheck একটি অত্যন্ত জনপ্রিয় লাইব্রেরি, যা স্বয়ংক্রিয়ভাবে বৈধ ইনপুট তৈরি করে এবং আপনার প্রোগ্রামের প্রপার্টি বা বৈশিষ্ট্যগুলি যাচাই করতে সহায়ক হয়। এর মাধ্যমে আপনি প্রোগ্রামের লজিক্যাল ভুল খুঁজে পেতে পারেন যা সাধারণ টেস্ট কেস দিয়ে ধরা পড়বে না।


১. QuickCheck কি?

QuickCheck হল একটি Haskell লাইব্রেরি যা property-based testing এর জন্য ডিজাইন করা হয়েছে। Property-based testing এর মাধ্যমে, আপনি ফাংশন বা প্রোগ্রামের জন্য একটি সাধারণ বৈশিষ্ট্য (property) তৈরি করেন এবং তারপর QuickCheck আপনার জন্য অটোমেটিক্যালি ইনপুটের বিভিন্ন সেট তৈরি করে এবং তা পরীক্ষা করে। যদি কোনো ইনপুটের জন্য আপনার বৈশিষ্ট্যটি সঠিক না হয়, তাহলে QuickCheck একটি ত্রুটি (counterexample) প্রদান করবে।

QuickCheck স্বয়ংক্রিয়ভাবে random ইনপুট তৈরি করে এবং সেগুলোর উপর আপনার পরীক্ষিত বৈশিষ্ট্য প্রয়োগ করে।


২. QuickCheck ব্যবহার করার জন্য প্রস্তুতি

QuickCheck ব্যবহার করতে হলে প্রথমে QuickCheck লাইব্রেরি আপনার Haskell প্রোজেক্টে ইনস্টল করতে হবে। এটি Cabal বা Stack এর মাধ্যমে করা যায়।

ইনস্টলেশন:

cabal install QuickCheck

অথবা

stack install QuickCheck

ইনপোর্ট:

import Test.QuickCheck

৩. Property-Based Testing এর মৌলিক ধারণা

Property-Based Testing এ, আপনি একটি property বা বৈশিষ্ট্য লিখে দেন যা আপনার ফাংশন বা প্রোগ্রামটি অবশ্যই অনুসরণ করবে। তারপর, QuickCheck সেই property-এর সাথে মেলে এমন অনেক ইনপুট তৈরি করে এবং সেগুলির সাথে পরীক্ষার মাধ্যমে দেখতে পারে যে, আপনার প্রোগ্রাম সেই property পূরণ করছে কিনা।

উদাহরণ:

ধরা যাক, একটি ফাংশন যা দুটি পূর্ণসংখ্যার যোগফল প্রদান করে। আমরা যদি এই ফাংশনটি পরীক্ষা করতে চাই, তবে একটি property হতে পারে:

  • Commutative property: দুটি সংখ্যার যোগফল যেকোনো অর্ডারে একরকম হবে (যেমন, x + y এবং y + x একই ফলাফল দিবে)।
-- একটি সাধারণ যোগফল ফাংশন
add :: Int -> Int -> Int
add x y = x + y

-- Commutative property পরীক্ষা করা
commutativeProperty :: Int -> Int -> Bool
commutativeProperty x y = add x y == add y x

এখানে, commutativeProperty একটি property তৈরি করেছে যা পরীক্ষার জন্য add ফাংশনকে ব্যবহার করবে। QuickCheck এর মাধ্যমে আমরা এই property পরীক্ষা করতে পারি।


৪. QuickCheck দিয়ে Property-Based Testing

QuickCheck এর মাধ্যমে আমরা commutativeProperty পরীক্ষা করতে পারি। QuickCheck যেকোনো Int এর জন্য x এবং y এর মান নির্ধারণ করবে এবং commutativeProperty ফাংশনটি পরীক্ষা করবে।

উদাহরণ: QuickCheck দিয়ে পরীক্ষা

main :: IO ()
main = quickCheck commutativeProperty

এখানে, quickCheck ফাংশনটি commutativeProperty ফাংশনটি বিভিন্ন random ইনপুট দিয়ে পরীক্ষা করবে এবং দেখবে, যোগফল আদান-প্রদান করলে কী একই রেজাল্ট পাচ্ছি।

ফলাফল:

$ runghc QuickCheckExample.hs
+++ OK, passed 100 tests.

এটি নির্দেশ করে যে, আপনার প্রপার্টি সঠিকভাবে কাজ করছে এবং QuickCheck ১০০টি র্যান্ডম টেস্টে সফল হয়েছে।


৫. QuickCheck দিয়ে আরও জটিল প্রপার্টি পরীক্ষা

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

-- একটি ফাংশন যা একটি লিস্টের প্রতিটি উপাদানকে গুণ করে
multiplyEachBy2 :: [Int] -> [Int]
multiplyEachBy2 = map (*2)

-- লিস্টের আকার অপরিবর্তিত থাকার প্রপার্টি
sizeProperty :: [Int] -> Bool
sizeProperty xs = length xs == length (multiplyEachBy2 xs)

এখানে, sizeProperty একটি প্রপার্টি যা পরীক্ষা করবে যে, লিস্টের আকার গুণফল করার পরও অপরিবর্তিত থাকে

পরীক্ষার উদাহরণ:

main :: IO ()
main = quickCheck sizeProperty

ফলাফল:

+++ OK, passed 100 tests.

এটি নির্দেশ করে যে, multiplyEachBy2 ফাংশনটি লিস্টের আকার পরিবর্তন করে না।


৬. QuickCheck এর উন্নত বৈশিষ্ট্য

  1. Gen টাইপ:
    QuickCheck এ আপনি Gen টাইপ ব্যবহার করে কাস্টম ইনপুট জেনারেট করতে পারেন। এটি একটি প্রকার তৈরি করে যার মধ্যে আপনি ইনপুটের বিশেষ ধরনের গঠন বা সীমানা নির্ধারণ করতে পারেন।

    উদাহরণ:

    import Test.QuickCheck
    
    -- Custom Generator for even numbers
    evenGen :: Gen Int
    evenGen = arbitrary `suchThat` even
    
    -- Property to test that the number is even
    evenProperty :: Int -> Property
    evenProperty x = forAll evenGen (\x -> even x)
  2. Test Coverage:
    QuickCheck স্বয়ংক্রিয়ভাবে টেস্ট কভারেজ প্রদান করে। এটি আপনার দেওয়া প্রপার্টির জন্য বিভিন্ন ইনপুটের সম্ভাব্য কভারেজ পরীক্ষা করে, যাতে সম্ভাব্য ত্রুটি বা ভুল ধরা পড়ে।

৭. Conclusion

Haskell এর QuickCheck লাইব্রেরি property-based testing এর জন্য একটি খুবই শক্তিশালী টুল, যা আপনার কোডের বৈশিষ্ট্যগুলি অটোমেটিক্যালি পরীক্ষার জন্য সহায়ক। এর মাধ্যমে আপনি ফাংশন বা প্রোগ্রামের সঠিকতা নিশ্চিত করতে পারেন এবং সম্ভাব্য ত্রুটিগুলি দ্রুত খুঁজে বের করতে পারেন। এর সাহায্যে, কোডের উন্নতির জন্য প্রয়োজনীয় বৈশিষ্ট্য বা প্যারামিটার নির্ধারণ করা সহজ হয়ে যায়, যা সঠিক এবং নির্ভরযোগ্য কোড তৈরি করতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...