সি-তে CUnit

Si Te Cunit



CUnit সিস্টেমটি C-তে ইউনিট পরীক্ষা করার জন্য ব্যবহৃত হয়, যা পরীক্ষাগুলির প্রশাসন এবং সম্পাদনের জন্য সক্ষম করে। এটি সাধারণত ব্যবহৃত ডেটা টাইপগুলি পরীক্ষা করার জন্য বিভিন্ন ধরণের দাবীকে কভার করে এবং পরীক্ষার কাঠামো তৈরি করার জন্য একটি সাধারণ আর্কিটেকচার ব্যবহার করে। ব্যবহারকারীর পরীক্ষার কোডটি CUnit-এর সাথে সংযুক্ত, যা একটি স্ট্যাটিক লাইব্রেরি হিসাবে ডিজাইন করা হয়েছে। আমরা CUnit টেস্ট ফ্রেমওয়ার্ক ব্যবহার করে C প্রোগ্রামের কাজ এবং ফাংশনগুলির কার্যকারিতা পরীক্ষা করতে পারি। সি প্রোগ্রামের প্রতিটি নির্দিষ্ট কাজের বিভিন্ন ইনপুট পরিস্থিতি এবং আউটপুট সীমাবদ্ধতা রয়েছে। সি প্রোগ্রামটি পরীক্ষা করার জন্য CUnit ব্যবহার করতে, আমাদের প্রথমে এটি আমাদের সিস্টেমে ইনস্টল করা উচিত। CUnit ইনস্টল করার পদক্ষেপগুলি নীচে বর্ণিত হয়েছে।

উবুন্টু 22.04 এ CUnit ফ্রেমওয়ার্ক কীভাবে ব্যবহার করবেন

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








sudo সুবিধাগুলি অর্জন করতে, টার্মিনাল sudo ব্যবহারকারীর কাছ থেকে প্রমাণীকরণ জিজ্ঞাসা করেছে। তারপর, সিস্টেম প্যাকেজ এবং তাদের নির্ভরতা আপডেট করুন, যেমন নীচে দেখানো হয়েছে।




এখন, আমরা নিম্নলিখিত কমান্ডটি ব্যবহার করে CUnit ফ্রেমওয়ার্ক ইনস্টল করেছি। এই কমান্ডটি প্যাকেজ সংগ্রহস্থল থেকে libcunitl, libcunitl-doc, এবং libcunitl-dev প্যাকেজগুলি ইনস্টল করতে পারে।




একবার CUnit ইনস্টলেশন কমান্ড কার্যকর করা হলে, ব্যবহারকারীর পাসওয়ার্ড প্রয়োজন। CUnit অপরিহার্য প্যাকেজগুলি আমাদের উবুন্টু 22.04 এ ইনস্টল করা হয়েছে।





উদাহরণ 1

আমরা পূর্ববর্তী বিভাগে CUnit কাঠামোর ইনস্টলেশন ধাপটি সম্পন্ন করেছি। এখন, আমরা CUnit টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে নিম্নলিখিত উদাহরণে প্রত্যাশিত ফলাফল দেখতে যোগফল এবং পার্থক্য পদ্ধতি পরীক্ষা করেছি।



# অন্তর্ভুক্ত করুন
#include
# অন্তর্ভুক্ত করুন
#include
# 'CUnit/Basic.h' অন্তর্ভুক্ত করুন

int init_suite ( অকার্যকর ) { ফিরে 0 ; }
int clean_suite ( অকার্যকর ) { ফিরে 0 ; }

int MySum ( আপনি a1, আপনি b1 )

{
int res1;
res1 =a1+b1;
ফিরে res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
ফিরে res2;
}

void test_MySum ( অকার্যকর )
{
WITH_ASSERT ( 4 ==মাইসম ( দুই , দুই ) ) ;
WITH_ASSERT ( 8 ==মাইসম ( 5 , 3 ) ) ;
WITH_ASSERT ( দুই ==মাইসম ( - দুই , 4 ) ) ;
WITH_ASSERT ( 7 ==মাইসম ( 0 , 7 ) ) ;
}


void test_MyDiff ( অকার্যকর )
{
WITH_ASSERT ( 3 ==মাইডিফ ( 5 , দুই ) ) ;
WITH_ASSERT ( - 4 ==মাইডিফ ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==মাইডিফ ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==মাইডিফ ( 0 , 9 ) ) ;
}


int প্রধান ( অকার্যকর )
{

CU_pSuite pSuite1,pSuite2 = NULL;

যদি ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
ফিরে CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'পরীক্ষা স্যুট1' , init_suite, clean_suite ) ;
যদি ( NULL == pSuite1 ) {
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}

যদি ( ( NULL == CU_add_test ( pSuite1, ' \n \n সমষ্টি ফাংশন টেস্টিং \n \n ' , test_MySum ) ) )
{
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}

যদি ( ( NULL == CU_add_test ( pSuite1, ' \n \n পার্থক্য ফাংশন পরীক্ষা \n \n ' , test_MyDiff ) ) )
{
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}

CU_বেসিক_রান_টেস্ট ( ) ;

CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}







প্রথমত, CUnit স্ট্রাকচার জেনারেট করার জন্য, আমরা CUnit লাইব্রেরি 'CUnit/Basic.h' অন্তর্ভুক্ত করেছি। এই সি লাইব্রেরিটি ইউনিট টেস্টিং ফ্রেমওয়ার্কের জন্য এবং একটি সাধারণ কনসোল আউটপুট ইন্টারফেস অফার করে। তারপরে আমরা পরীক্ষার জন্য আমাদের প্রোগ্রামে দুটি ফাংশন যোগ করেছি, স্যুট ফাংশন শুরু করার জন্য 'init_suite' এবং স্যুট ফাংশন পরিষ্কার করার জন্য 'clean_suite'।

এরপর, আমরা CUnit দ্বারা পরীক্ষা করার জন্য 'MySum' এবং 'MyDiff' পদ্ধতিগুলি তৈরি করেছি। আমরা এই ফাংশনগুলির জন্য কন্সট্রাক্টরকে ডেকেছি, যা ভেরিয়েবলগুলিকে ধারণ করে যার উপর যোগফল এবং পার্থক্য অপারেশন করা হয়েছে। এর পরে, আমরা পরীক্ষা করার জন্য 'test_MySum' হিসাবে একটি ফাংশন প্রতিষ্ঠা করেছি। ফাংশনের ভিতরে, আমরা 'CU_ASSERT' পদ্ধতি ব্যবহার করেছি, যেখানে যোগফলের জন্য init এক্সপ্রেশনগুলি বরাদ্দ করা হয়েছে। 'test_MySum' এর মতোই, আমরা 'CU_ASSERT' পদ্ধতি ব্যবহার করে বিভিন্ন অপারেশনের জন্য এক্সপ্রেশন পরীক্ষা করার জন্য test_MyDiff ফাংশন তৈরি করেছি।

তারপর, আমাদের মূল পদ্ধতির ভিতরে CUnit রানার কোড আছে। এখানে, আমরা 'CU_pSuite' পদ্ধতি থেকে দুটি স্যুট, 'pSuite1' এবং 'pSuite2' তৈরি করেছি এবং এই স্যুটগুলিকে একটি NULL মান নির্ধারণ করেছি। আমরা CUnit পরীক্ষা চালানোর জন্য এই স্যুটগুলি তৈরি করেছি যা পরীক্ষার রেজিস্ট্রিতে নিবন্ধিত হওয়া উচিত। 'টেস্ট_রেজিস্ট্রি'-এ স্যুটগুলি যোগ করার আগে, আমরা রেজিস্ট্রি তৈরি করেছি এবং 'যদি শর্ত' দিয়ে শুরু করেছি। আমরা টেস্টিং স্যুটগুলির জন্য রেজিস্ট্রি তৈরি করার জন্য 'CU_initialze_registry()' পদ্ধতি ব্যবহার করেছি।

এর পরে, আমরা CUnit-এর 'CU_add_suite' পদ্ধতি ব্যবহার করে পরীক্ষা রেজিস্ট্রিতে pSuite1 যোগ করেছি। এর পরে, আমরা 'CU_add_test()' পদ্ধতি ব্যবহার করে নির্দিষ্ট স্যুটগুলিতে আমাদের পরীক্ষাগুলি, 'test_MySum' এবং 'test_MyDiff' যোগ করেছি। শেষ পর্যন্ত, আমরা 'CU_basic_run_tests()' পদ্ধতিতে কল করে CUnit পরীক্ষার ফলাফল প্রদর্শন করেছি এবং ফলাফলগুলি সফলভাবে প্রদর্শিত হওয়ার পরে রেজিস্ট্রি পরিষ্কার করেছি। CUnit পরীক্ষা করার সময় যে ত্রুটির সম্মুখীন হয়েছে তা 'CU_get_error()' ফাংশন দ্বারা নিক্ষেপ করা হবে।

পূর্ববর্তী CUnit পরীক্ষার ফাইলটি mytest.c ফাইল হিসাবে সংরক্ষণ করা হয়েছে। আমরা এই C ফাইলটি GCC কমান্ডের সাথে কার্যকর করেছি। আমরা CUnit পরীক্ষা ফাইল সম্পাদনের জন্য -lcunit পতাকা ব্যবহার করেছি। এই কমান্ড দিয়ে, আমাদের কোড কম্পাইল করা হয়. তারপর, আমরা mytest ফাইলটি কার্যকর করেছি, এবং এটি CUnit পরীক্ষার প্রত্যাশিত ফলাফল দেখিয়েছে কারণ সমস্ত পরীক্ষা কোনও ব্যর্থতা ছাড়াই পাস করা হয়েছিল।

উদাহরণ 2

আমাদের আরেকটি উদাহরণ আছে যেখানে আমরা CUnit পদ্ধতির মাধ্যমে দুটি ফাইল হ্যান্ডলিং পদ্ধতি, 'fread' এবং 'fprintf' পরীক্ষা করেছি। আমরা CUnit পরীক্ষা ফাংশন ব্যবহার করে অস্থায়ী ফাইলটি খুললাম এবং বন্ধ করেছি। CUnit পরীক্ষার অপারেশনগুলি অস্থায়ী ফাইল থেকে লেখা এবং পড়ার মাধ্যমে লাইব্রেরি ফাংশন পরীক্ষা করে।

# অন্তর্ভুক্ত করুন
#include
# অন্তর্ভুক্ত করুন
#include
# 'CUnit/Basic.h' অন্তর্ভুক্ত করুন

স্ট্যাটিক ফাইল * ফাইল = NULL;
int init_suite1 ( অকার্যকর )
{
যদি ( NULL == ( ফাইল = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
ফিরে -1 ;
}
অন্য {
ফিরে 0 ;
}
}

int clean_suite1 ( অকার্যকর )
{
যদি ( 0 ! = fclose ( ফাইল ) ) {
ফিরে -1 ;
}
অন্য {
ফাইল = NULL;
ফিরে 0 ;
}
}


void test_fprintf ( অকার্যকর )
{
int x1 = 10 ;

যদি ( শূন্য ! = ফাইল ) {
WITH_ASSERT ( দুই == fprintf ( ফাইল , 'প্রশ্ন \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( ফাইল , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( অকার্যকর )
{
স্বাক্ষরবিহীন চর বাফার [ বিশ ] ;

যদি ( শূন্য ! = ফাইল ) {
রিওয়াইন্ড ( ফাইল ) ;
WITH_ASSERT ( 9 == ফ্রেড ( buffer, sizeof ( স্বাক্ষরবিহীন চর ) , বিশ , ফাইল ) ) ;
WITH_ASSERT ( 0 == strncmp ( বাফার 'প্রশ্ন \n x1 = 10' , 9 ) ) ;
}
}

int প্রধান ( )
{
CU_pSuite pSuite = NULL;
যদি ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
ফিরে CU_get_error ( ) ;
pSuite = CU_add_suite ( 'স্যুট1' , init_suite1, clean_suite1 ) ;
যদি ( NULL == pSuite ) {
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}
যদি ( ( NULL == CU_add_test ( pSuite, 'fprintf() ফাংশন টেস্ট' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'fread() ফাংশন টেস্ট' , test_fread ) ) )
{
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_বেসিক_রান_টেস্ট ( ) ;
CU_ক্লিনআপ_রেজিস্ট্রি ( ) ;
ফিরে CU_get_error ( ) ;
}







হেডার ফাইলের মধ্যে, আমরা CUnit স্ট্যান্ডার্ড লাইব্রেরি 'CUnit.h/Basic.h' সংজ্ঞায়িত করেছি। তারপরে, আমরা পরীক্ষা দ্বারা ব্যবহৃত ফাইলের পয়েন্টার হিসাবে 'ফাইল' ঘোষণা করেছি। এর পরে, আমরা 'init_suite1' ফাংশন তৈরি করেছি যা অস্থায়ী ফাইল 'MyFile.txt' খোলে এবং সাফল্যের মান শূন্য দেয়; অন্যথায়, একটি অ-শূন্য মান ফেরত দেওয়া হবে। ফাইলটি বন্ধ করার জন্য, আমরা স্যুট ক্লিনআপ ফাংশন তৈরি করেছি, যা অস্থায়ী ফাইলটি বন্ধ করার সময় ব্যর্থতার ক্ষেত্রে একটি অ-শূন্য মান প্রদান করে। অন্যথায়, অস্থায়ী ফাইলটি সফলভাবে বন্ধ করার পরে, শূন্য মান প্রাপ্ত হয়। তারপরে, আমরা একটি ফাংশন 'test_fprintf' প্রয়োগ করেছি যেখানে আমরা অস্থায়ী ফাইল 'MYfile.txt'-এ ডেটা সন্নিবেশ করেছি। এই পরীক্ষার ফাংশনগুলি আমরা ফাইলটিতে লেখার চেষ্টা করেছি এমন বাইটের সংখ্যাও যাচাই করে।

এর পরে, আমরা ফ্রেড পদ্ধতি পরীক্ষা করার জন্য 'test_fread' ফাংশনের জন্য আরেকটি ফাংশন তৈরি করেছি। এখানে, আমরা পরীক্ষা করেছি যে নির্দিষ্ট অক্ষরগুলি 'test_fprinf()' ফাংশন দ্বারা পূর্বে লিখিত ডেটাতে উপস্থিত রয়েছে। তারপরে, আমাদের কাছে প্রধান ফাংশন রয়েছে যেখানে সেট আপ এবং সঞ্চালিত পরীক্ষাগুলি পরিচালনা করা হয়। আমরা প্রধান ফাংশনে 'pSuite' সংজ্ঞায়িত করেছি এবং 'CU_initialize_resgistry' পরীক্ষা ফাংশন ব্যবহার করে রেজিস্ট্রি শুরু করেছি। আমরা রেজিস্ট্রিতে স্যুট যোগ করার জন্য 'CU_add_suite' ফাংশনকেও বলেছি এবং 'CU_add_test' ফাংশনের সাহায্যে স্যুটগুলিতে নির্দিষ্ট পরীক্ষাগুলি যোগ করেছি।

মৌলিক CUnit পরীক্ষার ইন্টারফেস শেষ পর্যন্ত কোডের ফলাফল প্রদর্শন করতে ব্যবহৃত হয়। লক্ষ্য করুন যে প্রধান ফাংশন সফলভাবে কার্যকর করার পরে একটি 'CUE_SUCCESS' এবং অসফল সম্পাদনের পরে একটি ভিন্ন 'CUnit_error' কোড প্রদান করে।

আমরা CUnit পরীক্ষার জন্য পূর্ববর্তী কোডটি চালিয়েছি, যা প্রোগ্রামের সারাংশ এবং সফল পরীক্ষার পদ্ধতির বার্তা প্রদর্শন করে।

উপসংহার

CUnit হল একটি মূল কাঠামো যা বিভিন্ন ইউজার ইন্টারফেস প্রদান করে। এটি আমাদের টেস্ট স্যুট, টেস্ট কেস এবং টেস্ট রেজিস্ট্রি পরিচালনা করতে দেয়। প্রোগ্রামগুলি পরীক্ষা করা এবং সেই পরীক্ষার ফলাফলগুলি দেখা ব্যবহারকারী ইন্টারফেস দ্বারা সহজ করা হয়েছে। আমরা এই নিবন্ধটির সাথে C-তে CUnit পরীক্ষার কাঠামোটি কভার করেছি। আমরা ইনস্টলেশন প্রদর্শন করেছি এবং তারপর সি ভাষায় দুটি চলমান প্রোগ্রাম বাস্তবায়ন করেছি। পরীক্ষিত পূর্ববর্তী প্রোগ্রামগুলি সফল ফলাফল দিয়েছে।