CUnit trong C

Cunit Trong C



Hệ thống CUnit được sử dụng để thực hiện kiểm thử đơn vị trong C, cho phép quản trị và thực hiện kiểm tra. Nó bao gồm một loạt các xác nhận để kiểm tra các kiểu dữ liệu thường được sử dụng và sử dụng một kiến ​​trúc đơn giản để tạo cấu trúc kiểm tra. Mã thử nghiệm của người dùng được liên kết với CUnit, được thiết kế như một thư viện tĩnh. Chúng tôi có thể kiểm tra hiệu suất của các nhiệm vụ và chức năng của chương trình C bằng cách sử dụng khung kiểm tra CUnit. Mỗi nhiệm vụ cụ thể của chương trình C đều có các hoàn cảnh đầu vào và giới hạn đầu ra khác nhau. Để sử dụng CUnit để kiểm tra chương trình C, trước tiên chúng ta nên cài đặt nó vào hệ thống của mình. Các bước cài đặt CUnit được trình bày dưới đây.

Cách sử dụng CUnit Framework trong Ubuntu 22.04

Để sử dụng khung thử nghiệm CUnit trong hệ thống của chúng tôi, chúng tôi cần thực hiện theo các bước cài đặt. Các bước này áp dụng cho hệ thống Ubuntu 22.04. Trước khi cài đặt, lần đầu tiên chúng tôi cập nhật hệ thống của mình. Hệ thống yêu cầu đặc quyền sudo để được cập nhật lệnh apt.








Để có được đặc quyền sudo, thiết bị đầu cuối đã yêu cầu xác thực từ người dùng sudo. Sau đó, cập nhật các gói hệ thống và các gói phụ thuộc của chúng, như được hiển thị bên dưới.




Bây giờ, chúng ta đã cài đặt CUnit framework bằng cách sử dụng lệnh sau. Lệnh này có thể cài đặt các gói libcunitl, libcunitl-doc và libcunitl-dev từ kho lưu trữ gói.




Khi lệnh cài đặt CUnit được thực thi, mật khẩu người dùng là bắt buộc. Các gói thiết yếu CUnit đã được cài đặt trong Ubuntu 22.04 của chúng tôi.





ví dụ 1

Chúng ta đã hoàn thành bước cài đặt CUnit framework trong phần trước. Bây giờ, chúng tôi đã thử nghiệm phương pháp tổng và chênh lệch để xem kết quả mong đợi trong ví dụ sau bằng cách sử dụng khung thử nghiệm CUnit.



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

int init_suite ( vô hiệu ) { trở về 0 ; }
int clean_suite ( vô hiệu ) { trở về 0 ; }

int MySum ( bạn là a1, bạn là b1 )

{
int res1;
res1 = a1 + b1;
trở về res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 = a2-b2;
trở về res2;
}

void test_MySum ( vô hiệu )
{
WITH_ASSERT ( 4 == MySum ( hai , hai ) ) ;
WITH_ASSERT ( số 8 == MySum ( 5 , 3 ) ) ;
WITH_ASSERT ( hai == MySum ( - hai , 4 ) ) ;
WITH_ASSERT ( 7 == MySum ( 0 , 7 ) ) ;
}


void test_MyDiff ( vô hiệu )
{
WITH_ASSERT ( 3 == MyDiff ( 5 , hai ) ) ;
WITH_ASSERT ( - 4 == MyDiff ( 4 , số 8 ) ) ;
WITH_ASSERT ( - 7 == MyDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 == MyDiff ( 0 , 9 ) ) ;
}


int main ( vô hiệu )
{

CU_pSuite pSuite1, pSuite2 = NULL;

nếu ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
trở về CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Bộ thử nghiệm1' , init_suite, clean_suite ) ;
nếu ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}

nếu ( ( NULL == CU_add_test ( pSuite1, ' \N \N Kiểm tra hàm tổng \N \N ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}

nếu ( ( NULL == CU_add_test ( pSuite1, ' \N \N Kiểm tra chức năng khác biệt \N \N ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}







Đầu tiên, để tạo cấu trúc CUnit, chúng tôi đã chèn thư viện CUnit “CUnit / Basic.h” với từ khóa bao gồm. Thư viện C này dành cho các khuôn khổ kiểm thử đơn vị và cung cấp giao diện đầu ra bảng điều khiển đơn giản. Sau đó, chúng tôi đã thêm hai hàm, “init_suite” để khởi tạo hàm bộ và “clean_suite” để dọn dẹp hàm bộ, vào chương trình của chúng tôi để thử nghiệm.

Tiếp theo, chúng tôi đã xây dựng các phương thức, “MySum” và “MyDiff”, để CUnit kiểm tra. Chúng tôi đã gọi hàm tạo cho các hàm này, hàm này chứa các biến mà các phép toán tổng và chênh lệch đã được thực hiện. Tiếp theo, chúng tôi đã thiết lập một chức năng là “test_MySum” để kiểm tra. Bên trong hàm, chúng tôi đã sử dụng phương thức “CU_ASSERT”, nơi các biểu thức init cho tổng được gán. Tương tự như “test_MySum”, chúng tôi đã xây dựng hàm test_MyDiff để kiểm tra biểu thức cho các hoạt động khác nhau bằng phương thức “CU_ASSERT”.

Sau đó, chúng ta có mã chạy CUnit bên trong phương thức chính. Ở đây, chúng tôi đã tạo hai bộ, “pSuite1” và “pSuite2”, từ phương thức “CU_pSuite” và gán giá trị NULL cho các bộ này. Chúng tôi đã tạo các bộ này để thực hiện kiểm tra CUnit sẽ được đăng ký trong sổ đăng ký kiểm tra. Trước khi thêm các bộ vào “test_registry”, chúng tôi đã tạo sổ đăng ký và khởi tạo nó với “if condition”. Chúng tôi đã sử dụng phương thức “CU_initialze_registry ()” để tạo sổ đăng ký cho các bộ thử nghiệm.

Sau đó, chúng tôi đã thêm pSuite1 vào sổ đăng ký thử nghiệm bằng cách gọi phương thức “CU_add_suite” của CUnit. Sau đó, chúng tôi đã thêm các thử nghiệm của mình, “test_MySum” và “test_MyDiff”, vào các bộ được chỉ định bằng cách sử dụng phương thức “CU_add_test ()”. Cuối cùng, chúng tôi đã hiển thị kết quả của bài kiểm tra CUnit bằng cách gọi phương thức “CU_basic_run_tests ()” và làm sạch sổ đăng ký sau khi kết quả được hiển thị thành công. Lỗi gặp phải khi thực hiện các bài kiểm tra CUnit sẽ được đưa ra bởi hàm “CU_get_error ()”.

Tệp kiểm tra CUnit trước đó được lưu dưới dạng tệp mytest.c. Chúng tôi đã thực thi tệp C này bằng lệnh GCC. Chúng tôi đã sử dụng cờ -lcunit để thực thi tệp thử nghiệm CUnit. Với lệnh này, mã của chúng tôi được biên dịch. Sau đó, chúng tôi thực thi tệp mytest và nó cho thấy kết quả mong đợi của bài kiểm tra CUnit vì tất cả các bài kiểm tra đều được vượt qua mà không gặp bất kỳ lỗi nào.

Ví dụ 2

Chúng tôi có một ví dụ khác trong đó chúng tôi đã thử nghiệm hai phương pháp xử lý tệp, “fread” và “fprintf”, bằng cách tiếp cận CUnit. Chúng tôi đã mở và đóng tệp tạm thời bằng các chức năng kiểm tra CUnit. Các hoạt động kiểm tra CUnit kiểm tra các chức năng thư viện bằng cách ghi và đọc từ tệp tạm thời.

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

FILE tĩnh * tập tin = KHÔNG;
int init_suite1 ( vô hiệu )
{
nếu ( KHÔNG CÓ == ( tập tin = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
trở về -1 ;
}
khác {
trở về 0 ;
}
}

int clean_suite1 ( vô hiệu )
{
nếu ( 0 ! = fclose ( tập tin ) ) {
trở về -1 ;
}
khác {
tập tin = KHÔNG;
trở về 0 ;
}
}


void test_fprintf ( vô hiệu )
{
int x1 = 10 ;

nếu ( VÔ GIÁ TRỊ ! = tập tin ) {
WITH_ASSERT ( hai == fprintf ( tập tin , 'Q \N ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( tập tin , 'x1 =% d' , x1 ) ) ;
}
}

void test_fread ( vô hiệu )
{
bộ đệm ký tự không dấu [ hai mươi ] ;

nếu ( VÔ GIÁ TRỊ ! = tập tin ) {
tua lại ( tập tin ) ;
WITH_ASSERT ( 9 == fread ( đệm, kích thước ( ký tự không dấu ) , hai mươi , tập tin ) ) ;
WITH_ASSERT ( 0 == strncmp ( đệm, 'Q \N x1 = 10 ' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
nếu ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
trở về CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suite1' , init_suite1, clean_suite1 ) ;
nếu ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}
nếu ( ( NULL == CU_add_test ( pSuite, 'Kiểm tra hàm fprintf ()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'Kiểm tra hàm fread ()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
trở về CU_get_error ( ) ;
}







Trong tệp tiêu đề, chúng tôi đã xác định thư viện tiêu chuẩn CUnit “CUnit.h / Basic.h”. Sau đó, chúng tôi khai báo 'tệp' như một con trỏ đến tệp được sử dụng bởi các bài kiểm tra. Tiếp theo, chúng ta đã xây dựng hàm “init_suite1” để mở tệp tạm thời “MyFile.txt” và trả về giá trị 0 khi thành công; nếu không, giá trị khác 0 sẽ được trả về. Để đóng tệp, chúng tôi đã tạo hàm dọn dẹp bộ, hàm này cũng trả về giá trị khác 0 khi bị lỗi trong khi đóng tệp tạm thời. Nếu không, khi đóng tệp tạm thời thành công, giá trị bằng không sẽ nhận được. Sau đó, chúng tôi chỉ đơn giản triển khai một hàm “test_fprintf” nơi chúng tôi đã chèn dữ liệu vào tệp tạm thời “MYfile.txt”. Các hàm kiểm tra này cũng xác minh số byte mà chúng tôi đã cố gắng ghi vào tệp.

Sau đó, chúng tôi tạo một hàm khác cho hàm “test_fread” để kiểm tra phương thức fread. Ở đây, chúng tôi đã kiểm tra xem các ký tự được chỉ định có trong dữ liệu được ghi trước đó bằng hàm “test_fprinf ()” hay không. Sau đó, chúng ta có chức năng chính, nơi xử lý các bài kiểm tra được thiết lập và thực thi. Chúng tôi đã xác định “pSuite” trong chức năng chính và khởi tạo sổ đăng ký bằng chức năng kiểm tra “CU_initialize_resgistry”. Chúng tôi cũng đã gọi hàm “CU_add_suite” để thêm bộ vào sổ đăng ký và thêm các bài kiểm tra được chỉ định vào bộ với sự trợ giúp của hàm “CU_add_test”.

Cuối cùng, các giao diện kiểm tra CUnit cơ bản được sử dụng để hiển thị kết quả của mã. Lưu ý rằng hàm chính trả về “CUE_SUCCESS” khi thực hiện thành công và một mã “CUnit_error” khác khi thực hiện không thành công.

Chúng tôi đã chạy mã trước đó cho kiểm tra CUnit, mã này hiển thị tóm tắt chương trình và thông báo phương pháp kiểm tra thành công.

Sự kết luận

CUnit là một khung cốt lõi cung cấp nhiều giao diện người dùng khác nhau. Nó cho phép chúng tôi quản lý các bộ thử nghiệm, trường hợp thử nghiệm và đăng ký thử nghiệm. Việc kiểm tra các chương trình và xem kết quả của các bài kiểm tra đó được thực hiện dễ dàng hơn bởi các giao diện người dùng. Chúng tôi đã đề cập đến khung kiểm tra CUnit trong C với bài viết này. Chúng tôi đã trình diễn cài đặt và sau đó triển khai hai chương trình đang chạy bằng ngôn ngữ C. Các chương trình trước đây được thử nghiệm đã cho kết quả thành công.