CUnit dalam C

Cunit Dalam C



Sistem CUnit digunakan untuk melaksanakan ujian unit dalam C, yang membolehkan pentadbiran dan pelaksanaan ujian. Ia merangkumi pelbagai dakwaan untuk menguji jenis data yang biasa digunakan dan menggunakan seni bina mudah untuk mencipta struktur ujian. Kod ujian pengguna dipautkan dengan CUnit, yang direka sebagai perpustakaan statik. Kami mungkin memeriksa prestasi tugas dan fungsi program C menggunakan rangka kerja ujian CUnit. Setiap tugas tertentu program C mempunyai keadaan input dan had keluaran yang berbeza. Untuk menggunakan CUnit untuk menguji program C, kami harus memasangnya terlebih dahulu dalam sistem kami. Langkah-langkah untuk memasang CUnit digariskan di bawah.

Cara Menggunakan Rangka Kerja CUnit dalam Ubuntu 22.04

Untuk menggunakan rangka kerja ujian CUnit dalam sistem kami, kami perlu mengikuti langkah pemasangan. Langkah-langkah ini digunakan untuk sistem Ubuntu 22.04. Sebelum pemasangan, kami terlebih dahulu mengemas kini sistem kami. Sistem memerlukan keistimewaan sudo untuk dikemas kini dengan arahan apt.








Untuk memperoleh keistimewaan sudo, terminal meminta pengesahan daripada pengguna sudo. Kemudian, kemas kini pakej sistem dan kebergantungannya, seperti yang ditunjukkan di bawah.




Sekarang, kami telah memasang rangka kerja CUnit dengan menggunakan arahan berikut. Perintah ini boleh memasang pakej libcunitl, libcunitl-doc, dan libunitl-dev daripada repositori pakej.




Setelah arahan pemasangan CUnit dilaksanakan, kata laluan pengguna diperlukan. Pakej penting CUnit telah dipasang dalam Ubuntu 22.04 kami.





Contoh 1

Kami menyelesaikan langkah pemasangan rangka kerja CUnit dalam bahagian sebelumnya. Kini, kami telah menguji kaedah jumlah dan perbezaan untuk melihat hasil yang dijangkakan dalam contoh berikut menggunakan rangka kerja ujian CUnit.



#include
#include
#include
#include
#include 'CUnit/Basic.h'

int init_suite ( batal ) { kembali 0 ; }
int clean_suite ( batal ) { kembali 0 ; }

int MySum ( anda adalah a1, anda adalah b1 )

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

int MyDiff ( int a2, int b2 )

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

void test_MySum ( batal )
{
WITH_ASSERT ( 4 ==MySum ( dua , dua ) ) ;
WITH_ASSERT ( 8 ==MySum ( 5 , 3 ) ) ;
WITH_ASSERT ( dua ==MySum ( - dua , 4 ) ) ;
WITH_ASSERT ( 7 ==MySum ( 0 , 7 ) ) ;
}


ujian batal_MyDiff ( batal )
{
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 ( batal )
{

CU_pSuite pSuite1,pSuite2 = NULL;

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

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

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

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

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}







Pertama, untuk menjana struktur CUnit, kami telah memasukkan perpustakaan CUnit 'CUnit/Basic.h' dengan kata kunci yang disertakan. Pustaka C ini adalah untuk rangka kerja ujian unit dan menawarkan antara muka keluaran konsol yang ringkas. Kemudian kami menambah dua fungsi, 'init_suite' untuk pemulaan fungsi suite dan 'clean_suite' untuk pembersihan fungsi suite, pada program kami untuk ujian.

Seterusnya, kami membina kaedah, 'MySum' dan 'MyDiff', untuk diuji oleh CUnit. Kami telah memanggil pembina untuk fungsi ini, yang memegang pembolehubah yang mana operasi jumlah dan perbezaan telah dilakukan. Seterusnya, kami telah menubuhkan fungsi sebagai 'test_MySum' untuk menguji. Di dalam fungsi, kami telah menggunakan kaedah 'CU_ASSERT', di mana ungkapan init untuk jumlah itu ditetapkan. Sama seperti 'test_MySum', kami telah membina fungsi test_MyDiff untuk menguji ungkapan untuk operasi yang berbeza menggunakan kaedah 'CU_ASSERT'.

Kemudian, kami mempunyai kod pelari CUnit di dalam kaedah utama. Di sini, kami telah mencipta dua suite, 'pSuite1' dan 'pSuite2', daripada kaedah 'CU_pSuite' dan memberikan suite ini nilai NULL. Kami telah mencipta suite ini untuk melaksanakan ujian CUnit yang harus didaftarkan dalam pendaftaran ujian. Sebelum menambah suite pada 'test_registry', kami mencipta pendaftaran dan memulakannya dengan 'keadaan jika'. Kami telah menggunakan kaedah 'CU_initialze_registry()' untuk membuat pendaftaran untuk suite ujian.

Selepas itu, kami menambah pSuite1 pada pendaftaran ujian dengan menggunakan kaedah 'CU_add_suite' CUnit. Selepas itu, kami menambah ujian kami, 'test_MySum' dan 'test_MyDiff', kepada suite yang ditentukan dengan menggunakan kaedah 'CU_add_test()'. Pada akhirnya, kami memaparkan keputusan ujian CUnit dengan memanggil kaedah 'CU_basic_run_tests()' dan membersihkan pendaftaran sebaik sahaja keputusan dipaparkan dengan jayanya. Ralat yang dihadapi semasa melakukan ujian CUnit akan dilemparkan oleh fungsi 'CU_get_error()'.

Fail ujian CUnit sebelumnya disimpan sebagai fail mytest.c. Kami telah melaksanakan fail C ini dengan arahan GCC. Kami telah menggunakan bendera -lcunit untuk pelaksanaan fail ujian CUnit. Dengan arahan ini, kod kami disusun. Kemudian, kami melaksanakan fail mytest, dan ia menunjukkan keputusan jangkaan ujian CUnit kerana semua ujian telah diluluskan tanpa sebarang kegagalan.

Contoh 2

Kami mempunyai satu lagi contoh di mana kami telah menguji dua kaedah pengendalian fail, 'fread' dan 'fprintf', dengan pendekatan CUnit. Kami membuka dan menutup fail sementara menggunakan fungsi ujian CUnit. Operasi ujian CUnit menguji fungsi perpustakaan dengan menulis dan membaca daripada fail sementara.

#include
#include
#include
#include
#include 'CUnit/Basic.h'

FAIL statik * fail = NULL;
int init_suite1 ( batal )
{
jika ( NULL == ( fail = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
kembali -1 ;
}
lain {
kembali 0 ;
}
}

int clean_suite1 ( batal )
{
jika ( 0 ! = tutup ( fail ) ) {
kembali -1 ;
}
lain {
fail = NULL;
kembali 0 ;
}
}


batal ujian_fprintf ( batal )
{
int x1 = 10 ;

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

batal ujian_fread ( batal )
{
penimbal char yang tidak ditandatangani [ dua puluh ] ;

jika ( NULL ! = fail ) {
putar balik ( fail ) ;
WITH_ASSERT ( 9 == takut ( penimbal, saiz ( char yang tidak ditandatangani ) , dua puluh , fail ) ) ;
WITH_ASSERT ( 0 == strncmp ( penampan, '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, 'Ujian fungsi fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'Ujian fungsi fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}
CU_basic_set_mod ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
kembali CU_get_error ( ) ;
}







Dalam fail pengepala, kami telah menentukan perpustakaan standard CUnit 'CUnit.h/Basic.h'. Kemudian, kami mengisytiharkan 'fail' sebagai penunjuk kepada fail yang digunakan oleh ujian. Seterusnya, kami telah membina fungsi 'init_suite1' yang membuka fail sementara 'MyFile.txt' dan mengembalikan nilai sifar pada kejayaan; jika tidak, nilai bukan sifar akan dikembalikan. Untuk menutup fail, kami telah mencipta fungsi pembersihan suite, yang juga mengembalikan nilai bukan sifar pada kegagalan semasa menutup fail sementara. Jika tidak, apabila berjaya menutup fail sementara, nilai sifar diperoleh. Kemudian, kami hanya melaksanakan fungsi 'test_fprintf' di mana kami telah memasukkan data ke dalam fail sementara 'MYfile.txt'. Fungsi ujian ini juga mengesahkan bilangan bait yang kami cuba tulis dalam fail.

Selepas itu, kami mencipta satu lagi fungsi untuk fungsi 'test_fread' untuk menguji kaedah fread. Di sini, kami telah menyemak bahawa aksara yang ditentukan hadir dalam data yang ditulis sebelum ini oleh fungsi 'test_fprinf()'. Kemudian, kita mempunyai fungsi utama di mana ujian yang ditetapkan dan dilaksanakan dikendalikan. Kami mentakrifkan 'pSuite' dalam fungsi utama dan memulakan pendaftaran menggunakan fungsi ujian 'CU_initialize_resgistry'. Kami juga telah memanggil fungsi 'CU_add_suite' untuk menambah suite pada pendaftaran dan menambah ujian yang ditentukan pada suite dengan bantuan fungsi 'CU_add_test'.

Antara muka ujian CUnit asas digunakan pada akhirnya untuk memaparkan hasil kod. Ambil perhatian bahawa fungsi utama mengembalikan 'CUE_SUCCESS' apabila pelaksanaan berjaya dan kod 'CUnit_error' yang berbeza apabila pelaksanaan tidak berjaya.

Kami telah menjalankan kod sebelumnya untuk ujian CUnit, yang memaparkan ringkasan program dan mesej kaedah ujian yang berjaya.

Kesimpulan

CUnit ialah rangka kerja teras yang menyediakan pelbagai antara muka pengguna. Ia membolehkan kami mengurus suite ujian, kes ujian dan daftar ujian. Menguji program dan melihat keputusan ujian tersebut menjadi lebih mudah oleh antara muka pengguna. Kami telah merangkumi rangka kerja ujian CUnit dalam C dengan artikel ini. Kami menunjukkan pemasangan dan kemudian melaksanakan dua program berjalan dalam bahasa C. Program yang diuji sebelum ini telah memberikan hasil yang berjaya.