Property-Based Testing এর জন্য QuickCheck ব্যবহার
Property-Based Testing হল একটি টেস্টিং পদ্ধতি যা পরীক্ষার জন্য নির্দিষ্ট properties (গুণাবলী) নির্ধারণ করে এবং স্বয়ংক্রিয়ভাবে সিস্টেমের কোড বা ফাংশন পরীক্ষা করার জন্য random test cases তৈরি করে। এটি unit testing বা example-based testing এর তুলনায় অনেক শক্তিশালী, কারণ এতে কোডের সমস্ত সম্ভাব্য ইনপুট বা সীমার ক্ষেত্রে পরীক্ষা করা সম্ভব হয়।
QuickCheck হল Erlang এর জন্য একটি জনপ্রিয় টুল, যা property-based testing সরবরাহ করে। এটি Erlang ভাষার জন্য randomized test case generation ব্যবহার করে এবং কোডের গুণাবলীর ভিত্তিতে তা পরীক্ষা করে।
QuickCheck এর ভূমিকা
QuickCheck মূলত property-based testing এর জন্য একটি টুল যা আপনাকে এমন properties বা গুণাবলী পরীক্ষা করতে দেয় যা আপনার কোডের সঠিকতা নিশ্চিত করতে সহায়তা করে। এই টুলটি random test cases তৈরি করে এবং সেগুলিকে পরীক্ষা করে যে আপনার কোড সেই গুণাবলী পূরণ করছে কি না।
QuickCheck মূলত:
- Random Test Case Generation: র্যান্ডম ইনপুট তৈরি করে এবং সেগুলি ব্যবহার করে কোড পরীক্ষা করে।
- Property Checking: কোডের নির্দিষ্ট গুণাবলীর সাথে পরীক্ষা করে দেখায়, যেমন সিস্টেমের ইনভারিয়েন্টস, সঠিকতা, অথবা সীমা।
- Shrinkage: যখন একটি ত্রুটি পাওয়া যায়, তখন QuickCheck ছোট বা সুনির্দিষ্ট ইনপুট তৈরি করে, যা ত্রুটির সঠিক কারণ নির্ধারণে সহায়তা করে।
QuickCheck এর মৌলিক ধারণা
QuickCheck মূলত ফাংশনের ইনপুটগুলির জন্য properties নির্ধারণ করে এবং সেগুলির জন্য স্বয়ংক্রিয়ভাবে র্যান্ডম টেস্ট কেস তৈরি করে। QuickCheck এর মাধ্যমে পরীক্ষা করা যায়:
- কোডের সঠিকতা নিশ্চিত করা।
- সিস্টেমের আচরণ বা আউটপুট নির্ধারিত গুণাবলীর সাথে সামঞ্জস্যপূর্ণ কিনা তা পরীক্ষা করা।
QuickCheck এর ব্যবহার
QuickCheck ব্যবহারের জন্য আপনাকে প্রথমে prop_* (properties) লিখতে হবে এবং তারপর তা quickcheck ফাংশনের মাধ্যমে পরীক্ষা করতে হবে।
উদাহরণ: QuickCheck সেটআপ
ধরা যাক, আমরা একটি ফাংশন লিখেছি যা দুটি সংখ্যার যোগফল দেয়। আমাদের লক্ষ্য হল সেই যোগফল গুণাবলী পরীক্ষার জন্য property-based test তৈরি করা।
- QuickCheck টেস্টের জন্য প্রোপার্টি লেখার উদাহরণ:
প্রথমে, কোডে একটি যোগফল ফাংশন লিখি।
% sum.erl
-module(sum).
-export([add/2]).
add(X, Y) -> X + Y.এখন, QuickCheck এর মাধ্যমে এই যোগফল ফাংশনটির প্রোপার্টি পরীক্ষা করব, যেমন:
- যোগফল দুটি সংখ্যার সাথে কমপ্লেক্স ইনপুট ভ্যালুর সাথে ঠিক থাকবে।
- একটি ইনপুট ভ্যালু পরিবর্তন করলে আউটপুট ঠিক থাকবে।
- QuickCheck প্রোপার্টি লেখার উদাহরণ:
কোডে একটি property লিখি যা যাচাই করবে যে দুটি সংখ্যার যোগফল সবসময় সঠিক হবে।
% sum_test.erl
-module(sum_test).
-include_lib("eqc/include/eqc.hrl").
-exports([prop_add/0]).
prop_add() ->
?FORALL({X, Y}, {integer(), integer()},
sum:add(X, Y) == X + Y
).এখানে, prop_add হল একটি property যা দুটি পূর্ণসংখ্যা (X এবং Y) গ্রহণ করবে এবং sum:add/2 ফাংশন দ্বারা যোগফল হিসাব করবে, এবং এটি যাচাই করবে যে যোগফল আসল যোগফলের সমান।
- QuickCheck চালানো:
এখন, আমরাquickcheckব্যবহার করে পরীক্ষা চালাতে পারি:
1> c(sum).
{ok,sum}
2> c(sum_test).
{ok,sum_test}
3> eqc:quickcheck(sum_test:prop_add()).এখানে quickcheck ফাংশনটি প্রোপার্টি পরীক্ষার জন্য র্যান্ডম ইনপুট তৈরি করবে এবং তারপরে ফাংশনটি পরীক্ষা করবে।
আউটপুট:
==> sum_test:prop_add/0
==> Passed: 100 tests.এখানে, QuickCheck 100টি র্যান্ডম টেস্ট কেস তৈরি করে এবং সেগুলির জন্য প্রোপার্টি পরীক্ষা করে। যদি সমস্ত টেস্ট সফল হয়, তবে তা "Passed" দেখাবে।
QuickCheck এর অগ্রগতির প্রক্রিয়া: Shrinking
যখন QuickCheck কোন failing property খুঁজে পায়, তখন তা shrinking প্রক্রিয়া চালায়। shrinking এর মাধ্যমে QuickCheck ছোট ছোট ইনপুট তৈরি করে, যা ত্রুটির মূল কারণ সনাক্ত করতে সহায়তা করে।
উদাহরণ:
যদি একটি প্রোপার্টি ব্যর্থ হয়, QuickCheck সেই ব্যর্থ ইনপুটটিকে ছোট করে, যেমন:
- যদি
{100, 200}একটি ইনপুট হিসেবে ব্যর্থ হয়, তবে এটি{50, 100}বা{5, 10}হিসাবে সংকুচিত হতে পারে।
এই shrinking প্রক্রিয়া ত্রুটির কারণটি দ্রুত খুঁজে বের করার জন্য খুবই সহায়ক।
QuickCheck এর সুবিধা
- Automated Random Testing: QuickCheck স্বয়ংক্রিয়ভাবে র্যান্ডম টেস্ট কেস তৈরি করে, যা কোডের বিভিন্ন প্রান্তে পরীক্ষার সুযোগ সৃষ্টি করে।
- Comprehensive Testing: আপনি নির্দিষ্ট গুণাবলীর ভিত্তিতে কোডের সমস্ত পরিস্থিতি পরীক্ষা করতে পারেন, যা এক্সেপ্টশনাল কেস এবং সীমার অবস্থানগুলোও পরীক্ষা করে।
- Shrinkage: যখন কোনো ত্রুটি পাওয়া যায়, তখন QuickCheck সেই ত্রুটির জন্য সংকুচিত ইনপুট তৈরি করে, যা ত্রুটির কারণ চিহ্নিত করতে সাহায্য করে।
- High Coverage: QuickCheck অনেক ধরনের ইনপুট পরীক্ষা করে, যা সাধারণভাবে ম্যানুয়ালি লেখা টেস্টের মাধ্যমে কভার করা কঠিন।
উপসংহার
QuickCheck Erlang এ property-based testing এর জন্য একটি শক্তিশালী টুল। এটি র্যান্ডম ইনপুট তৈরি করে এবং নির্দিষ্ট প্রোপার্টি বা গুণাবলী যাচাই করে কোডের সঠিকতা নিশ্চিত করতে সহায়তা করে। QuickCheck এর মাধ্যমে আপনি সিস্টেমের বিভিন্ন অংশ পরীক্ষা করতে পারেন এবং নিশ্চিত করতে পারেন যে কোডের প্রতিটি অংশ সঠিকভাবে কাজ করছে, বিশেষ করে যখন কোডের ইনপুট সীমা বা আচরণ জটিল হয়ে ওঠে। QuickCheck ব্যবহার করার মাধ্যমে আপনি আপনার কোডের দুর্বল জায়গাগুলি চিহ্নিত করতে পারবেন এবং ত্রুটির কারণ দ্রুত নির্ধারণ করতে পারবেন।
Read more