C 단위

C Dan Wi



CUnit 시스템은 C에서 단위 테스트를 수행하는 데 사용되며, 이를 통해 테스트를 관리하고 실행할 수 있습니다. 일반적으로 사용되는 데이터 유형을 테스트하기 위한 다양한 범위의 주장을 다루고 테스트 구조를 생성하기 위한 간단한 아키텍처를 활용합니다. 사용자의 테스트 코드는 정적 라이브러리로 설계된 CUnit과 연결됩니다. CUnit 테스트 프레임워크를 사용하여 C 프로그램의 작업과 기능의 성능을 조사할 수 있습니다. C 프로그램의 모든 특정 작업에는 서로 다른 입력 환경과 출력 제한이 있습니다. C 프로그램을 테스트하기 위해 CUnit을 사용하려면 먼저 시스템에 설치해야 합니다. CUnit 설치 단계는 아래에 설명되어 있습니다.

Ubuntu 22.04에서 CUnit 프레임워크를 사용하는 방법

시스템에서 CUnit 테스트 프레임워크를 활용하려면 설치 단계를 따라야 합니다. 이 단계는 Ubuntu 22.04 시스템에 적용됩니다. 설치하기 전에 먼저 시스템을 업데이트했습니다. apt 명령으로 업데이트하려면 시스템에 sudo 권한이 필요했습니다.








sudo 권한을 얻기 위해 단말은 sudo 사용자에게 인증을 요청했습니다. 그런 다음 아래와 같이 시스템 패키지와 해당 종속성을 업데이트합니다.




이제 다음 명령을 사용하여 CUnit 프레임워크를 설치했습니다. 이 명령은 패키지 저장소에서 libcunitl, libcunitl-doc 및 libcunitl-dev 패키지를 설치할 수 있습니다.




CUnit 설치 명령이 실행되면 사용자 암호가 필요합니다. CUnit 필수 패키지는 Ubuntu 22.04에 설치되었습니다.





실시예 1

이전 섹션에서 CUnit 프레임워크의 설치 단계를 완료했습니다. 이제 CUnit 테스트 프레임워크를 사용하여 다음 예제에서 예상되는 결과를 확인하기 위해 합계 및 차이 방법을 테스트했습니다.



#포함
#include <문자열.h>
#include
#include <문자열.h>
#include 'CUnit/Basic.h'

int init_suite ( 무효의 ) { 반품 0 ; }
int clean_suite ( 무효의 ) { 반품 0 ; }

정수 마이섬 ( 당신은 1, 당신은 b1 )

{
정수 res1;
res1 =a1+b1;
반품 res1;
}

정수 MyDiff ( 정수 a2, 정수 b2 )

{
정수 res2;
res2 =a2-b2;
반품 res2;
}

무효 test_MySum ( 무효의 )
{
WITH_ASSERT ( 4 ==마이섬 ( , ) ) ;
WITH_ASSERT ( 8 ==마이섬 ( 5 , ) ) ;
WITH_ASSERT ( ==마이섬 ( - , 4 ) ) ;
WITH_ASSERT ( 7 ==마이섬 ( 0 , 7 ) ) ;
}


무효 test_MyDiff ( 무효의 )
{
WITH_ASSERT ( ==내 차이 ( 5 , ) ) ;
WITH_ASSERT ( - 4 ==내 차이 ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==내 차이 ( - , 4 ) ) ;
WITH_ASSERT ( - 9 ==내 차이 ( 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 ( 피스위트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'를 추가했습니다.

다음으로 CUnit에서 테스트할 'MySum' 및 'MyDiff' 메서드를 구성했습니다. 합계 및 차분 연산이 수행된 변수를 보유하는 이러한 함수에 대한 생성자를 호출했습니다. 다음으로 테스트를 위한 'test_MySum'이라는 함수를 설정했습니다. 함수 내에서 합계에 대한 초기화 표현식이 할당되는 'CU_ASSERT' 메서드를 사용했습니다. 'test_MySum'과 마찬가지로 'CU_ASSERT' 메서드를 사용하여 다양한 작업에 대한 표현식을 테스트하기 위해 test_MyDiff 함수를 구성했습니다.

그런 다음 main 메소드 내부에 CUnit 러너 코드가 있습니다. 여기에서 'CU_pSuite' 메서드에서 'pSuite1' 및 'pSuite2'라는 두 제품군을 만들고 이 제품군에 NULL 값을 할당했습니다. 테스트 레지스트리에 등록해야 하는 CUnit 테스트를 실행하기 위해 이러한 제품군을 만들었습니다. 'test_registry'에 제품군을 추가하기 전에 레지스트리를 생성하고 'if 조건'으로 초기화했습니다. 우리는 테스트 스위트를 위한 레지스트리를 생성하기 위해 'CU_initialze_registry()' 메소드를 사용했습니다.

그런 다음 CUnit의 'CU_add_suite' 메서드를 호출하여 pSuite1을 테스트 레지스트리에 추가했습니다. 그런 다음 'CU_add_test()' 메서드를 사용하여 'test_MySum' 및 'test_MyDiff' 테스트를 지정된 제품군에 추가했습니다. 결국 'CU_basic_run_tests()' 메서드를 호출하여 CUnit 테스트 결과를 표시하고 결과가 성공적으로 표시되면 레지스트리를 정리했습니다. CUnit 테스트를 수행하는 동안 발생한 오류는 'CU_get_error()' 함수에 의해 발생합니다.

이전 CUnit 테스트 파일은 mytest.c 파일로 저장됩니다. 이 C 파일을 GCC 명령으로 실행했습니다. CUnit 테스트 파일 실행을 위해 -lcunit 플래그를 사용했습니다. 이 명령으로 코드가 컴파일됩니다. 그런 다음 mytest 파일을 실행했는데, 모든 테스트가 실패 없이 통과하여 CUnit 테스트의 예상 결과를 보여주었다.

실시예 2

CUnit 접근 방식으로 'fread'와 'fprintf'라는 두 가지 파일 처리 방법을 테스트한 또 다른 예가 있습니다. CUnit 테스트 함수를 사용하여 임시 파일을 열고 닫았습니다. CUnit 테스트 작업은 임시 파일을 쓰고 읽어 라이브러리 기능을 테스트합니다.

#포함
#include <문자열.h>
#include
#include <문자열.h>
#include 'CUnit/Basic.h'

정적 파일 * 파일 = NULL;
int init_suite1 ( 무효의 )
{
만약에 ( NULL == ( 파일 = fopen ( '내파일.txt' , '와 +' ) ) ) {
반품 -1 ;
}
또 다른 {
반품 0 ;
}
}

정수 clean_suite1 ( 무효의 )
{
만약에 ( 0 ! = f닫기 ( 파일 ) ) {
반품 -1 ;
}
또 다른 {
파일 = NULL;
반품 0 ;
}
}


무효 test_fprintf ( 무효의 )
{
정수 x1 = 10 ;

만약에 ( 없는 ! = 파일 ) {
WITH_ASSERT ( == fprintf ( 파일 , '큐 \N ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( 파일 , 'x1 = %d' , x1 ) ) ;
}
}

무효 test_fread ( 무효의 )
{
서명되지 않은 문자 버퍼 [ 이십 ] ;

만약에 ( 없는 ! = 파일 ) {
되감기 ( 파일 ) ;
WITH_ASSERT ( 9 == 겁먹다 ( 버퍼, 크기 ( 서명되지 않은 문자 ) , 이십 , 파일 ) ) ;
WITH_ASSERT ( 0 == strncmp ( 완충기, '큐 \N 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 ( 피스위트, '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'를 정의했습니다. 그런 다음 테스트에서 사용하는 파일에 대한 포인터로 'file'을 선언했습니다. 다음으로 임시 파일 'MyFile.txt'를 열고 성공 시 값 0을 반환하는 'init_suite1' 함수를 구성했습니다. 그렇지 않으면 0이 아닌 값이 반환됩니다. 파일을 닫기 위해 임시 파일을 닫는 동안 실패 시 0이 아닌 값을 반환하는 제품군 정리 함수를 만들었습니다. 그렇지 않으면 임시 파일을 성공적으로 닫을 때 0 값을 얻습니다. 그런 다음 임시 파일 'MYfile.txt'에 데이터를 삽입한 'test_fprintf' 함수를 간단히 구현했습니다. 이 테스트 함수는 또한 파일에 쓰려고 시도한 바이트 수를 확인했습니다.

그런 다음 fread 메서드를 테스트하기 위해 'test_fread' 함수에 대한 또 다른 함수를 만들었습니다. 여기서는 'test_fprinf()' 함수를 통해 이전에 작성된 데이터에 지정된 문자가 존재하는지 확인했습니다. 그런 다음 테스트 설정 및 실행을 처리하는 주요 기능이 있습니다. 메인 함수에서 'pSuite'를 정의하고 'CU_initialize_resgistry' 테스트 함수를 사용하여 레지스트리를 초기화했습니다. 또한 'CU_add_suite' 함수를 호출하여 레지스트리에 제품군을 추가하고 'CU_add_test' 기능의 도움으로 제품군에 지정된 테스트를 추가했습니다.

기본 CUnit 테스트 인터페이스는 결국 코드의 결과를 표시하는 데 사용됩니다. main 함수는 성공적으로 실행되면 'CUE_SUCCESS'를 반환하고 실패하면 다른 'CUnit_error' 코드를 반환합니다.

프로그램 요약과 성공적인 테스트의 메소드 메시지를 표시하는 CUnit 테스트에 대한 이전 코드를 실행했습니다.

결론

CUnit은 다양한 사용자 인터페이스를 제공하는 핵심 프레임워크입니다. 테스트 스위트, 테스트 케이스 및 테스트 레지스트리를 관리할 수 있습니다. 프로그램을 테스트하고 이러한 테스트의 결과를 보는 것은 사용자 인터페이스를 통해 더 쉬워집니다. 우리는 이 기사에서 C의 CUnit 테스트 프레임워크를 다뤘습니다. 설치를 시연한 다음 C 언어로 실행 중인 두 개의 프로그램을 구현했습니다. 테스트한 이전 프로그램은 성공적인 결과를 제공했습니다.