C میں CUnit

C My Cunit



CUnit سسٹم کو C میں یونٹ ٹیسٹنگ کرنے کے لیے استعمال کیا جاتا ہے، جو ٹیسٹوں کی انتظامیہ اور عمل درآمد کے قابل بناتا ہے۔ یہ عام طور پر استعمال ہونے والے ڈیٹا کی اقسام کی جانچ کے لیے دعووں کی ایک متنوع رینج کا احاطہ کرتا ہے اور ٹیسٹ ڈھانچے بنانے کے لیے ایک سادہ فن تعمیر کا استعمال کرتا ہے۔ صارف کا ٹیسٹنگ کوڈ CUnit کے ساتھ منسلک ہے، جسے ایک جامد لائبریری کے طور پر ڈیزائن کیا گیا ہے۔ ہم CUnit ٹیسٹ فریم ورک کا استعمال کرتے ہوئے C پروگرام کے کاموں اور افعال کی کارکردگی کا جائزہ لے سکتے ہیں۔ سی پروگرام کے ہر خاص کام میں مختلف ان پٹ حالات اور آؤٹ پٹ کی حدود ہوتی ہیں۔ سی پروگرام کی جانچ کے لیے CUnit استعمال کرنے کے لیے، ہمیں اسے اپنے سسٹم میں پہلے انسٹال کرنا چاہیے۔ CUnit کو انسٹال کرنے کے اقدامات ذیل میں بیان کیے گئے ہیں۔

Ubuntu 22.04 میں CUnit فریم ورک کا استعمال کیسے کریں۔

ہمارے سسٹم میں CUnit ٹیسٹنگ فریم ورک کو استعمال کرنے کے لیے، ہمیں انسٹالیشن کے مراحل پر عمل کرنے کی ضرورت ہے۔ یہ اقدامات Ubuntu 22.04 سسٹم پر لاگو ہوتے ہیں۔ تنصیب سے پہلے، ہم نے پہلے اپنے سسٹم کو اپ ڈیٹ کیا۔ آپٹ کمانڈ کے ساتھ اپ ڈیٹ ہونے کے لیے سسٹم کو sudo استحقاق درکار ہے۔








sudo مراعات حاصل کرنے کے لیے، ٹرمینل نے sudo صارف سے تصدیق طلب کی۔ پھر، سسٹم پیکجز اور ان کے انحصار کو اپ ڈیٹ کریں، جیسا کہ ذیل میں دکھایا گیا ہے۔




اب، ہم نے درج ذیل کمانڈ کا استعمال کرکے CUnit فریم ورک انسٹال کیا ہے۔ یہ کمانڈ پیکیج ریپوزٹری سے libcunitl، libcunitl-doc، اور libcunitl-dev پیکجوں کو انسٹال کر سکتی ہے۔




ایک بار جب CUnit انسٹالیشن کمانڈ پر عمل درآمد ہو جاتا ہے، صارف کا پاس ورڈ درکار ہوتا ہے۔ ہمارے Ubuntu 22.04 میں CUnit ضروری پیکجز انسٹال کیے گئے ہیں۔





مثال 1

ہم نے پچھلے حصے میں CUnit فریم ورک کی تنصیب کا مرحلہ مکمل کر لیا ہے۔ اب، ہم نے CUnit ٹیسٹنگ فریم ورک کا استعمال کرتے ہوئے درج ذیل مثال میں متوقع نتائج دیکھنے کے لیے رقم اور فرق کا طریقہ آزمایا ہے۔



# شامل کریں
#include
# شامل کریں
#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_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}

اگر ( ( NULL == CU_add_test ( pSuite1، ' \n \n سم فنکشن ٹیسٹنگ \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}

اگر ( ( NULL == CU_add_test ( pSuite1، ' \n \n فرق فنکشن ٹیسٹنگ \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}







سب سے پہلے، CUnit ڈھانچہ تیار کرنے کے لیے، ہم نے CUnit لائبریری 'CUnit/Basic.h' کو شامل کلیدی لفظ کے ساتھ داخل کیا ہے۔ یہ سی لائبریری یونٹ ٹیسٹنگ فریم ورک کے لیے ہے اور ایک سادہ کنسول آؤٹ پٹ انٹرفیس پیش کرتی ہے۔ پھر ہم نے ٹیسٹنگ کے لیے اپنے پروگرام میں دو فنکشنز شامل کیے، 'init_suite' سویٹ فنکشن کی شروعات کے لیے اور 'clean_suite' سویٹ فنکشن کی صفائی کے لیے۔

اس کے بعد، ہم نے 'MySum' اور 'MyDiff'، CUnit کے ذریعے جانچنے کے لیے طریقے بنائے۔ ہم نے ان فنکشنز کے لیے کنسٹرکٹر کو بلایا ہے، جس میں وہ متغیرات ہیں جن پر رقم اور فرق کے آپریشن کیے گئے ہیں۔ اگلا، ہم نے جانچنے کے لیے 'test_MySum' کے بطور ایک فنکشن قائم کیا ہے۔ فنکشن کے اندر، ہم نے 'CU_ASSERT' طریقہ استعمال کیا ہے، جہاں sum کے لیے init ایکسپریشنز تفویض کیے گئے ہیں۔ 'test_MySum' کی طرح، ہم نے 'CU_ASSERT' طریقہ استعمال کرتے ہوئے مختلف آپریشنز کے لیے اظہار کو جانچنے کے لیے test_MyDiff فنکشن بنایا ہے۔

پھر، ہمارے پاس مرکزی طریقہ کے اندر CUnit رنر کوڈ ہے۔ یہاں، ہم نے 'CU_pSuite' طریقہ سے دو سویٹس، 'pSuite1' اور 'pSuite2' بنائے ہیں اور ان سویٹس کو NULL ویلیو تفویض کیا ہے۔ ہم نے یہ سویٹس CUnit ٹیسٹ کو انجام دینے کے لیے بنائے ہیں جنہیں ٹیسٹ رجسٹری میں رجسٹر کیا جانا چاہیے۔ سویٹس کو 'test_registry' میں شامل کرنے سے پہلے، ہم نے رجسٹری بنائی اور اسے 'if condition' کے ساتھ شروع کیا۔ ہم نے ٹیسٹنگ سویٹس کے لیے رجسٹری بنانے کے لیے '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 فائل کے طور پر محفوظ کیا گیا ہے۔ ہم نے اس سی فائل کو جی سی سی کمانڈ کے ساتھ عمل میں لایا ہے۔ ہم نے CUnit ٹیسٹ فائل پر عمل درآمد کے لیے -lcunit پرچم استعمال کیا ہے۔ اس کمانڈ کے ساتھ، ہمارا کوڈ مرتب ہوتا ہے۔ پھر، ہم نے mytest فائل کو عمل میں لایا، اور اس نے CUnit ٹیسٹ کے متوقع نتائج دکھائے کیونکہ تمام ٹیسٹ بغیر کسی ناکامی کے پاس ہو گئے تھے۔

مثال 2

ہمارے پاس ایک اور مثال ہے جہاں ہم نے CUnit اپروچ کے ذریعے فائل ہینڈلنگ کے دو طریقوں، 'fread' اور 'fprintf' کا تجربہ کیا ہے۔ ہم نے CUnit ٹیسٹ کے افعال کا استعمال کرتے ہوئے عارضی فائل کو کھولا اور بند کیا۔ CUnit ٹیسٹ آپریشنز عارضی فائل سے لکھنے اور پڑھ کر لائبریری کے افعال کی جانچ کرتے ہیں۔

# شامل کریں
#include
# شامل کریں
#include
#include 'CUnit/Basic.h'

جامد فائل * فائل = NULL;
int init_suite1 ( باطل )
{
اگر ( NULL == ( فائل = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
واپسی -1 ;
}
اور {
واپسی 0 ;
}
}

int clean_suite1 ( باطل )
{
اگر ( 0 ! = بند کرنا ( فائل ) ) {
واپسی -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 == فریڈ ( بفر، سائز کا ( غیر دستخط شدہ چار ) , بیس , فائل ) ) ;
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_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}
اگر ( ( NULL == CU_add_test ( pSuite، 'fprintf() فنکشن ٹیسٹ' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite، 'fread() فنکشن ٹیسٹ' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
واپسی CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
واپسی 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 ٹیسٹ فریم ورک کا احاطہ کیا ہے۔ ہم نے انسٹالیشن کا مظاہرہ کیا اور پھر C زبان میں دو چلنے والے پروگراموں کو لاگو کیا۔ ٹیسٹ کیے گئے پچھلے پروگراموں نے کامیاب نتائج دیے ہیں۔