CUnit ใน C

Cunit Ni 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



#include
#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;
}

เป็นโมฆะ 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 ) ) ;
}


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 ( พีสวีท1, ' \n \n การทดสอบฟังก์ชันผลรวม \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
กลับ CU_get_error ( ) ;
}

ถ้า ( ( NULL == CU_add_test ( พีสวีท1, ' \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” ด้วยคำหลักที่รวมไว้ ไลบรารี C นี้ใช้สำหรับเฟรมเวิร์กการทดสอบหน่วยและมีอินเทอร์เฟซเอาต์พุตคอนโซลที่เรียบง่าย จากนั้นเราได้เพิ่มสองฟังก์ชันคือ 'init_suite' สำหรับการเริ่มต้นฟังก์ชันชุดและ 'clean_suite' สำหรับการล้างฟังก์ชันชุดโปรแกรมสำหรับการทดสอบ

ต่อไป เราสร้างวิธีการ 'MySum' และ 'MyDiff' เพื่อทดสอบโดย CUnit เราได้เรียกตัวสร้างสำหรับฟังก์ชันเหล่านี้ ซึ่งเก็บตัวแปรที่ดำเนินการผลรวมและผลต่าง ต่อไป เราได้สร้างฟังก์ชันเป็น “test_MySum” เพื่อทดสอบ ภายในฟังก์ชัน เราใช้เมธอด “CU_ASSERT” โดยกำหนดนิพจน์เริ่มต้นสำหรับผลรวม เช่นเดียวกับ “test_MySum” เราได้สร้างฟังก์ชัน test_MyDiff เพื่อทดสอบนิพจน์สำหรับการดำเนินการต่างๆ โดยใช้เมธอด “CU_ASSERT”

จากนั้นเราก็มีรหัสนักวิ่ง CUnit ในวิธีหลัก ที่นี่ เราได้สร้างสองชุด '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 จะทดสอบการทำงานของไลบรารีโดยการเขียนและอ่านจากไฟล์ชั่วคราว

#include
#include
#include
#include
#รวม 'CUnit/Basic.h'

ไฟล์คงที่ * ไฟล์ = ว่าง;
int init_suite1 ( โมฆะ )
{
ถ้า ( NULL == ( ไฟล์ = fopen ( 'MyFile.txt' , 'ว +' ) ) ) {
กลับ -1 ;
}
อื่น {
กลับ 0 ;
}
}

int clean_suite1 ( โมฆะ )
{
ถ้า ( 0 ! = fclose ( ไฟล์ ) ) {
กลับ -1 ;
}
อื่น {
ไฟล์ = ว่าง;
กลับ 0 ;
}
}


เป็นโมฆะ test_fprintf ( โมฆะ )
{
int x1 = 10 ;

ถ้า ( โมฆะ ! = ไฟล์ ) {
WITH_ASSERT ( สอง == fprintf ( ไฟล์ , 'คิว \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( ไฟล์ , 'x1 = %d' , x1 ) ) ;
}
}

เป็นโมฆะ test_fread ( โมฆะ )
{
บัฟเฟอร์ถ่านที่ไม่ได้ลงชื่อ [ ยี่สิบ ] ;

ถ้า ( โมฆะ ! = ไฟล์ ) {
ย้อนกลับ ( ไฟล์ ) ;
WITH_ASSERT ( 9 == เฟรด ( บัฟเฟอร์ 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_cleanup_registry ( ) ;
กลับ CU_get_error ( ) ;
}
ถ้า ( ( NULL == CU_add_test ( พีสวีท 'ทดสอบฟังก์ชัน fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( พีสวีท 'การทดสอบฟังก์ชัน 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 โปรแกรมก่อนหน้าที่ทดสอบได้ให้ผลลัพธ์ที่ประสบความสำเร็จ