CUnit dalam C

Cunit Dalam C



Sistem CUnit digunakan untuk melakukan pengujian unit di C, yang memungkinkan administrasi dan pelaksanaan pengujian. Ini mencakup beragam pernyataan untuk menguji tipe data yang umum digunakan dan menggunakan arsitektur sederhana untuk membuat struktur pengujian. Kode pengujian pengguna ditautkan dengan CUnit, yang dirancang sebagai pustaka statis. Kami dapat memeriksa kinerja tugas dan fungsi program C menggunakan kerangka uji CUnit. Setiap tugas tertentu dari program C memiliki keadaan input dan batasan output yang berbeda. Untuk menggunakan CUnit untuk menguji program C, kita harus menginstalnya terlebih dahulu di sistem kita. Langkah-langkah untuk menginstal CUnit diuraikan di bawah ini.

Cara Menggunakan Kerangka Kerja CUnit di Ubuntu 22.04

Untuk memanfaatkan kerangka pengujian CUnit di sistem kami, kami harus mengikuti langkah-langkah instalasi. Langkah-langkah ini berlaku untuk sistem Ubuntu 22.04. Sebelum instalasi, kami terlebih dahulu memperbarui sistem kami. Sistem membutuhkan hak istimewa sudo untuk mendapatkan pembaruan dengan perintah apt.








Untuk mendapatkan hak istimewa sudo, terminal meminta otentikasi dari pengguna sudo. Kemudian, perbarui paket sistem dan dependensinya, seperti yang ditunjukkan di bawah ini.




Sekarang, kami telah menginstal kerangka kerja CUnit dengan menggunakan perintah berikut. Perintah ini dapat menginstal paket libcunitl, libcunitl-doc, dan libcunitl-dev dari repositori paket.




Setelah perintah instalasi CUnit dijalankan, kata sandi pengguna diperlukan. Paket penting CUnit telah diinstal di Ubuntu 22.04 kami.





Contoh 1

Kami menyelesaikan langkah instalasi kerangka kerja CUnit di bagian sebelumnya. Sekarang, kami telah menguji metode penjumlahan dan perbedaan untuk melihat hasil yang diharapkan dalam contoh berikut menggunakan kerangka pengujian CUnit.



#sertakan
#sertakan
#sertakan
#sertakan
#sertakan 'CUnit/Basic.h'

int init_suite ( ruang kosong ) { kembali 0 ; }
int clean_suite ( ruang kosong ) { kembali 0 ; }

int Jumlah Saya ( kamu a1, kamu b1 )

{
int res1;
res1 =a1+b1;
kembali res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
kembali res2;
}

batalkan test_MySum ( ruang kosong )
{
WITH_ASSERT ( 4 ==Jumlah Saya ( dua , dua ) ) ;
WITH_ASSERT ( 8 ==Jumlah Saya ( 5 , 3 ) ) ;
WITH_ASSERT ( dua ==Jumlah Saya ( - dua , 4 ) ) ;
WITH_ASSERT ( 7 ==Jumlah Saya ( 0 , 7 ) ) ;
}


batalkan test_MyDiff ( ruang kosong )
{
WITH_ASSERT ( 3 ==MyDiff ( 5 , dua ) ) ;
WITH_ASSERT ( - 4 ==MyDiff ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MyDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MyDiff ( 0 , 9 ) ) ;
}


int utama ( ruang kosong )
{

CU_pSuite pSuite1,pSuite2 = NULL;

jika ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
kembali CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Uji Coba1' , init_suite, clean_suite ) ;
jika ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}

jika ( ( NULL == CU_add_test ( pSuite1, ' \n \n Jumlah fungsi Pengujian \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}

jika ( ( NULL == CU_add_test ( pSuite1, ' \n \n Pengujian fungsi perbedaan \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}







Pertama, untuk menghasilkan struktur CUnit, kami telah memasukkan pustaka CUnit “CUnit/Basic.h” dengan kata kunci yang disertakan. Pustaka C ini untuk kerangka kerja pengujian unit dan menawarkan antarmuka keluaran konsol yang sederhana. Kemudian kami menambahkan dua fungsi, 'init_suite' untuk inisialisasi fungsi suite dan 'clean_suite' untuk pembersihan fungsi suite, ke program kami untuk pengujian.

Selanjutnya, kami membangun metode, 'MySum' dan 'MyDiff', untuk diuji oleh CUnit. Kami telah memanggil konstruktor untuk fungsi-fungsi ini, yang menyimpan variabel di mana operasi penjumlahan dan perbedaan telah dilakukan. Selanjutnya, kami telah menetapkan fungsi sebagai 'test_MySum' untuk diuji. Di dalam fungsi, kami telah menggunakan metode “CU_ASSERT”, di mana ekspresi init untuk jumlah ditetapkan. Sama seperti “test_MySum”, kami telah membangun fungsi test_MyDiff untuk menguji ekspresi untuk operasi yang berbeda menggunakan metode “CU_ASSERT”.

Kemudian, kami memiliki kode runner CUnit di dalam metode utama. Di sini, kami telah membuat dua suite, 'pSuite1' dan 'pSuite2', dari metode 'CU_pSuite' dan menetapkan nilai NULL untuk suite ini. Kami telah membuat suite ini untuk menjalankan pengujian CUnit yang harus didaftarkan di registri pengujian. Sebelum menambahkan suite ke 'test_registry', kami membuat registri dan menginisialisasinya dengan 'kondisi if'. Kami telah menggunakan metode 'CU_initialze_registry()' untuk membuat registri untuk suite pengujian.

Setelah itu, kami menambahkan pSuite1 ke registri pengujian dengan menerapkan metode 'CU_add_suite' dari CUnit. Setelah itu, kami menambahkan pengujian kami, 'test_MySum' dan 'test_MyDiff', ke suite yang ditentukan dengan menggunakan metode 'CU_add_test()'. Pada akhirnya, kami menampilkan hasil pengujian CUnit dengan memanggil metode “CU_basic_run_tests()” dan membersihkan registri setelah hasilnya berhasil ditampilkan. Kesalahan yang ditemui saat melakukan tes CUnit akan dilemparkan oleh fungsi 'CU_get_error()'.

File pengujian CUnit sebelumnya disimpan sebagai file mytest.c. Kami telah mengeksekusi file C ini dengan perintah GCC. Kami telah menggunakan flag -lcunit untuk eksekusi file pengujian CUnit. Dengan perintah ini, kode kami dikompilasi. Kemudian, kami mengeksekusi file mytest, dan itu menunjukkan hasil yang diharapkan dari tes CUnit karena semua tes lulus tanpa kegagalan.

Contoh 2

Kami memiliki contoh lain di mana kami telah menguji dua metode penanganan file, 'fread' dan 'fprintf', dengan pendekatan CUnit. Kami membuka dan menutup file sementara menggunakan fungsi tes CUnit. Operasi pengujian CUnit menguji fungsi perpustakaan dengan menulis dan membaca dari file sementara.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan 'CUnit/Basic.h'

FILE statis * mengajukan = NULL;
int init_suite1 ( ruang kosong )
{
jika ( NULL == ( mengajukan = fopen ( 'File Saya.txt' , 'w +' ) ) ) {
kembali -1 ;
}
kalau tidak {
kembali 0 ;
}
}

int clean_suite1 ( ruang kosong )
{
jika ( 0 ! = ftutup ( mengajukan ) ) {
kembali -1 ;
}
kalau tidak {
mengajukan = NULL;
kembali 0 ;
}
}


batalkan test_fprintf ( ruang kosong )
{
int x1 = 10 ;

jika ( BATAL ! = mengajukan ) {
WITH_ASSERT ( dua == fprintf ( mengajukan , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( mengajukan , 'x1 = %d' , x1 ) ) ;
}
}

batalkan test_fread ( ruang kosong )
{
buffer char yang tidak ditandatangani [ dua puluh ] ;

jika ( BATAL ! = mengajukan ) {
memutar ulang ( mengajukan ) ;
WITH_ASSERT ( 9 == takut ( penyangga, ukuran ( karakter yang tidak ditandatangani ) , dua puluh , mengajukan ) ) ;
WITH_ASSERT ( 0 == strncmp ( penyangga, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int utama ( )
{
CU_pSuite pSuite = NULL;
jika ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
kembali CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suite1' , init_suite1, clean_suite1 ) ;
jika ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}
jika ( ( NULL == CU_add_test ( pSuite, 'Uji fungsi fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'Tes fungsi fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}







Di dalam file header, kami telah mendefinisikan pustaka standar CUnit “CUnit.h/Basic.h”. Kemudian, kami mendeklarasikan 'file' sebagai penunjuk ke file yang digunakan oleh pengujian. Selanjutnya, kita telah membangun fungsi “init_suite1” yang membuka file sementara “MyFile.txt” dan mengembalikan nilai nol jika berhasil; jika tidak, nilai bukan nol akan dikembalikan. Untuk menutup file, kami telah membuat fungsi pembersihan suite, yang juga mengembalikan nilai bukan nol pada kegagalan saat menutup file sementara. Jika tidak, saat berhasil menutup file sementara, nilai nol diperoleh. Kemudian, kita cukup mengimplementasikan fungsi “test_fprintf” dimana kita telah memasukkan data ke dalam file sementara “MYfile.txt”. Fungsi pengujian ini juga memverifikasi jumlah byte yang kami coba tulis dalam file.

Setelah itu, kami membuat fungsi lain untuk fungsi 'test_fread' untuk menguji metode fread. Di sini, kami telah memeriksa bahwa karakter yang ditentukan ada dalam data yang ditulis sebelumnya oleh fungsi “test_fprinf()”. Kemudian, kami memiliki fungsi utama di mana tes yang disiapkan dan dieksekusi ditangani. Kami mendefinisikan 'pSuite' di fungsi utama dan menginisialisasi registri menggunakan fungsi uji 'CU_initialize_resgistry'. Kami juga telah memanggil fungsi 'CU_add_suite' untuk menambahkan suite ke registri dan menambahkan tes yang ditentukan ke suite dengan bantuan fungsi 'CU_add_test'.

Antarmuka pengujian CUnit dasar digunakan pada akhirnya untuk menampilkan hasil kode. Perhatikan bahwa fungsi utama mengembalikan 'CUE_SUCCESS' setelah eksekusi berhasil dan kode 'CUnit_error' yang berbeda pada eksekusi yang gagal.

Kami telah menjalankan kode sebelumnya untuk pengujian CUnit, yang menampilkan ringkasan program dan pesan metode pengujian yang berhasil.

Kesimpulan

CUnit adalah kerangka kerja inti yang menyediakan berbagai antarmuka pengguna. Ini memungkinkan kami untuk mengelola rangkaian pengujian, kasus pengujian, dan registry pengujian. Menguji program dan melihat hasil pengujian tersebut menjadi lebih mudah dengan antarmuka pengguna. Kami telah membahas kerangka pengujian CUnit di C dengan artikel ini. Kami mendemonstrasikan instalasi dan kemudian mengimplementasikan dua program yang sedang berjalan dalam bahasa C. Program-program sebelumnya yang diuji telah memberikan hasil yang sukses.