CUnit في C

Cunit Fy C



يستخدم نظام CUnit لإجراء اختبار الوحدة في C ، والذي يتيح إدارة وتنفيذ الاختبارات. يغطي مجموعة متنوعة من التأكيدات لاختبار أنواع البيانات شائعة الاستخدام ويستخدم بنية بسيطة لإنشاء هياكل الاختبار. يرتبط كود الاختبار الخاص بالمستخدم بـ CUnit ، المصمم كمكتبة ثابتة. قد نفحص أداء مهام ووظائف برنامج C باستخدام إطار عمل اختبار CUnit. كل مهمة معينة لبرنامج C لها ظروف إدخال مختلفة وقيود ناتجة. لاستخدام CUnit لاختبار برنامج C ، يجب علينا تثبيته أولاً في نظامنا. تم توضيح خطوات تثبيت CUnit أدناه.

كيفية استخدام CUnit Framework في Ubuntu 22.04

لاستخدام إطار عمل اختبار CUnit في نظامنا ، نحتاج إلى اتباع خطوات التثبيت. تنطبق هذه الخطوات على نظام Ubuntu 22.04. قبل التثبيت ، قمنا أولاً بتحديث نظامنا. طلب النظام امتياز sudo ليتم تحديثه باستخدام الأمر apt.








للحصول على امتيازات sudo ، طلبت المحطة المصادقة من مستخدم sudo. بعد ذلك ، قم بتحديث حزم النظام وتبعياتها ، كما هو موضح أدناه.




الآن ، قمنا بتثبيت إطار عمل CUnit باستخدام الأمر التالي. يمكن لهذا الأمر تثبيت حزم libcunitl و libcunitl-doc و libcunitl-dev من مستودع الحزمة.




بمجرد تنفيذ أمر تثبيت CUnit ، تكون كلمة مرور المستخدم مطلوبة. تم تثبيت حزم CUnit الأساسية في Ubuntu 22.04.





مثال 1

أكملنا خطوة تثبيت إطار عمل CUnit في القسم السابق. الآن ، اختبرنا طريقة الجمع والفرق لمعرفة النتائج المتوقعة في المثال التالي باستخدام إطار عمل اختبار CUnit.



# تضمين
# تضمين
# تضمين
# تضمين
# تضمين 'CUnit / Basic.h'

int init_suite ( فارغ ) { إرجاع 0 ؛ }
int clean_suite ( فارغ ) { إرجاع 0 ؛ }

Int MySum ( أنت a1 ، أنت b1 )

{
الدقة int1 ؛
الدقة 1 = a1 + b1 ؛
إرجاع الدقة 1 ؛
}

Int MyDiff ( int a2، int b2 )

{
res2 كثافة العمليات ؛
الدقة 2 =a2-b2;
إرجاع الدقة 2 ؛
}

test_MySum باطل ( فارغ )
{
WITH_ASSERT ( 4 == MySum ( اثنين و اثنين ) ) ؛
WITH_ASSERT ( 8 == MySum ( 5 و 3 ) ) ؛
WITH_ASSERT ( اثنين == MySum ( - اثنين و 4 ) ) ؛
WITH_ASSERT ( 7 == MySum ( 0 و 7 ) ) ؛
}


باطل test_MyDiff ( فارغ )
{
WITH_ASSERT ( 3 == MyDiff ( 5 و اثنين ) ) ؛
WITH_ASSERT ( - 4 == MyDiff ( 4 و 8 ) ) ؛
WITH_ASSERT ( - 7 == MyDiff ( - 3 و 4 ) ) ؛
WITH_ASSERT ( - 9 == MyDiff ( 0 و 9 ) ) ؛
}


انت مين ( فارغ )
{

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 ، ' اختبار دالة المجموع ' ، test_MySum ) ) )
{
CU_cleanup_registry ( ) ؛
إرجاع CU_get_error ( ) ؛
}

إذا ( ( NULL == CU_add_test ( pSuite1 ، ' اختبار دالة الفروق ' ، test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ؛
إرجاع CU_get_error ( ) ؛
}

CU_basic_run_tests ( ) ؛

CU_cleanup_registry ( ) ؛
إرجاع CU_get_error ( ) ؛
}







أولاً ، لإنشاء بنية CUnit ، قمنا بإدراج مكتبة CUnit 'CUnit / Basic.h' مع الكلمة الأساسية المضمنة. مكتبة C هذه مخصصة لأطر اختبار الوحدات وتوفر واجهة إخراج وحدة تحكم بسيطة. ثم أضفنا وظيفتين ، 'init_suite' لتهيئة وظيفة المجموعة و 'clean_suite' لتنظيف وظيفة المجموعة ، إلى برنامجنا للاختبار.

بعد ذلك ، قمنا ببناء طرق ، 'MySum' و 'MyDiff' ، ليتم اختبارها بواسطة CUnit. لقد قمنا باستدعاء مُنشئ هذه الوظائف ، والذي يحمل المتغيرات التي تم تنفيذ عمليات المجموع والفرق عليها. بعد ذلك ، أنشأنا دالة باسم 'test_MySum' لاختبارها. داخل الوظيفة ، استخدمنا طريقة 'CU_ASSERT' ، حيث يتم تعيين التعبيرات الأولية للمجموع. مثل 'test_MySum' ، قمنا ببناء دالة test_MyDiff لاختبار التعبير لعمليات مختلفة باستخدام طريقة 'CU_ASSERT'.

بعد ذلك ، لدينا كود CUnit runner داخل الطريقة الرئيسية. هنا ، قمنا بإنشاء مجموعتين ، 'pSuite1' و 'pSuite2' ، من طريقة 'CU_pSuite' وقمنا بتعيين قيمة NULL لهذه المجموعات. لقد أنشأنا هذه المجموعات لتنفيذ اختبار CUnit الذي يجب تسجيله في سجل الاختبار. قبل إضافة المجموعات إلى 'test_registry' ، أنشأنا السجل وقمنا بتهيئته باستخدام 'شرط if'. لقد استخدمنا طريقة 'CU_initialze_registry ()' لإنشاء السجل لاختبار المجموعات.

بعد ذلك ، أضفنا pSuite1 إلى سجل الاختبار عن طريق استدعاء طريقة 'CU_add_suite' في CUnit. بعد ذلك ، أضفنا اختباراتنا ، 'test_MySum' و 'test_MyDiff' ، إلى المجموعات المحددة باستخدام طريقة 'CU_add_test ()'. في النهاية ، عرضنا نتائج اختبار CUnit باستدعاء طريقة 'CU_basic_run_tests ()' وقمنا بتنظيف السجل بمجرد عرض النتائج بنجاح. سيتم طرح الخطأ الذي حدث أثناء إجراء اختبارات CUnit بواسطة الوظيفة 'CU_get_error ()'.

يتم حفظ ملف اختبار CUnit السابق كملف mytest.c. لقد قمنا بتنفيذ ملف C هذا باستخدام الأمر GCC. لقد استخدمنا علامة -lcunit لتنفيذ ملف اختبار CUnit. باستخدام هذا الأمر ، يتم تجميع التعليمات البرمجية الخاصة بنا. بعد ذلك ، قمنا بتنفيذ ملف mytest ، وأظهر النتائج المتوقعة لاختبار CUnit حيث تم اجتياز جميع الاختبارات دون أي فشل.

مثال 2

لدينا مثال آخر حيث قمنا باختبار طريقتين لمعالجة الملفات ، 'fread' و 'fprintf' ، من خلال نهج CUnit. فتحنا وأغلقنا الملف المؤقت باستخدام وظائف اختبار CUnit. تختبر عمليات اختبار CUnit وظائف المكتبة عن طريق الكتابة والقراءة من الملف المؤقت.

# تضمين
# تضمين
# تضمين
# تضمين
# تضمين 'CUnit / Basic.h'

ملف ثابت * ملف = NULL ؛
int init_suite1 ( فارغ )
{
إذا ( NULL == ( ملف = fopen ( 'MyFile.txt' و 'w +' ) ) ) {
إرجاع -1 ؛
}
آخر {
إرجاع 0 ؛
}
}

int clean_suite1 ( فارغ )
{
إذا ( 0 ! = إغلاق ( ملف ) ) {
إرجاع -1 ؛
}
آخر {
ملف = NULL ؛
إرجاع 0 ؛
}
}


test_fprintf باطلة ( فارغ )
{
int x1 = 10 ؛

إذا ( لا شيء ! = ملف ) {
WITH_ASSERT ( اثنين == fprintf ( ملف و ' ) ) ؛
WITH_ASSERT ( 7 == fprintf ( ملف و 'x1 =٪ d' ، x1 ) ) ؛
}
}

test_fread باطل ( فارغ )
{
شار العازلة غير الموقعة [ عشرين ] ؛

إذا ( لا شيء ! = ملف ) {
الترجيع ( ملف ) ؛
WITH_ASSERT ( 9 == fread ( عازلة ، sizeof ( حرف غير موقّع ) و عشرين و ملف ) ) ؛
WITH_ASSERT ( 0 == strncmp ( متعادل، x1 = 10 ' و 9 ) ) ؛
}
}

انت مين ( )
{
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' لاختبار طريقة fread. هنا ، تحققنا من أن الأحرف المحددة موجودة في البيانات المكتوبة مسبقًا بواسطة الوظيفة 'test_fprinf ()'. بعد ذلك ، لدينا الوظيفة الرئيسية حيث يتم التعامل مع الاختبارات التي تم إعدادها وتنفيذها. قمنا بتعريف 'pSuite' في الوظيفة الرئيسية وقمنا بتهيئة السجل باستخدام وظيفة الاختبار 'CU_initialize_resgistry'. لقد أطلقنا أيضًا على وظيفة 'CU_add_suite' لإضافة المجموعة إلى السجل وإضافة الاختبارات المحددة إلى المجموعات بمساعدة وظيفة 'CU_add_test'.

يتم استخدام واجهات اختبار CUnit الأساسية في النهاية لعرض نتائج الكود. لاحظ أن الوظيفة الرئيسية تقوم بإرجاع 'CUE_SUCCESS' عند التنفيذ الناجح وكود 'CUnit_error' مختلف عند التنفيذ غير الناجح.

لقد قمنا بتشغيل الكود السابق لاختبار CUnit ، والذي عرض ملخص البرنامج ورسالة طريقة الاختبارات الناجحة.

استنتاج

CUnit هو إطار عمل أساسي يوفر واجهات مستخدم متنوعة. يسمح لنا بإدارة مجموعات الاختبار وحالات الاختبار وسجلات الاختبار. أصبح اختبار البرامج والاطلاع على نتائج تلك الاختبارات أسهل من خلال واجهات المستخدم. لقد قمنا بتغطية إطار عمل اختبار CUnit في C مع هذه المقالة. عرضنا التثبيت ثم قمنا بتنفيذ برنامجين قيد التشغيل بلغة C. البرامج السابقة التي تم اختبارها أعطت نتائج ناجحة.