저번 시간에는 Cunit사용방법에서 짧게 대충 알아보았습니다.
이번 시간에도 짧게 대충 어떤 식으로 사용하는지 알아보도록 하겠습니다.
전 주로 개발툴을 이클립스를 사용합니다.이클립스를 사용해서 사용하는 방법을 알아보도록 하겠습니다.
그럼, 시작해 보겠습니다.

1. 그럼 위와 같은 순서로 샘플 프로젝트를 만들어 보겠습니다. 새로운 C 프로젝트 만들기

Menu -> New -> C Project선택

capture.png


2. 새로프젝트 생성

capture01.png

 

3. 아래와같이 새로운 프로젝트가 생성되었습니다. 그리고 Cunit이 설치가 제대로 되었다면 빨간 네모 안처럼 Cunit라이브러리도 보입니다.

capture02.png  

4. CunitSample.c파일은 삭제하고 아래의 샘플코드를 넣습니다.

테스트 대상 헤더파일

/*
 * func.h
 *
 *      Author: jwjw
 */

#ifndef FUNC_H_
#define FUNC_H_

extern char *get_name( char *p_tag);

#endif /* FUNC_H_ */

테스트 대상 파일

/*
* func.c
*
* Author: jwjw
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char buff[1024];

char *get_name( char *p_tag){

 int  n_tag;

 n_tag = p_tag[strlen(p_tag)-1]-'0';
 memset( buff, 0, sizeof( buff));

 switch( n_tag){
 case 3 : strcat( buff, "Name3");
 case 2 : strcat( buff, "Name2");
 case 1 : strcat( buff, "Name1");
 }
 return buff;
}

위의 switch문의 오류는 break;문이 없습니다. 그렇기 때문에 우리가 원하는 값을 리턴받지 못합니다.

저 소스 코드를 테스트해 보겠습니다.

 

5. Cunit사용방법

4.와같은 샘플소스가 있습니다. "func.c"의 Cunit테스트 코드를 만들기 위해서는 아래와 같은순서로 합니다.

   1) 테스트를 위한 함수를 작성.

   2) 테스트 레지스트리를 초기화

   3) 테스트 레지스트리에 스위트를 추가

   4) 스위트에 테스트 추가

   5) 적절한 인터페이스 예를 사용하여 실행 테스트

      - Automated : xml파일 출력

      - Basic : 표준 출력

      - Console : 콘솔입력으로 실행 선택/표준출력

      - Curses : 그래픽 인터페이스(UNIX계열)

    6) 테스트 레지스터 정리


 

소스 코드로 하면 아래와 같습니다.

/*
 * test.c
 */

#include "CUnit/CUnit.h"
#include "CUnit/Console.h"
#include "CUnit/Basic.h"
#include <stdio.h>
#include <string.h>

#include "func.h"


/**
 * 인수에 "tag1"을 넣어서 리턴값이 "Name1"인지 확인
 */
void get_name_test_01(void) {
 CU_ASSERT_STRING_EQUAL(get_name("tag1"), "Name1");
}

/**
 * 인수에 "tag2"을 넣어서 리턴값이 "Name2"인지 확인
 */
void get_name_test_02(void) {
 CU_ASSERT_STRING_EQUAL(get_name("tag2"), "Name2");
}

/**
 * 인수에 "tag3"을 넣어서 리턴값이 "Name3"인지 확인
 */
void get_name_test_03(void) {
 CU_ASSERT_STRING_EQUAL(get_name("tag3"), "Name3");
}

int main() {

 CU_pSuite suite = NULL;
 // 2)테스트 레지스트리를 초기화
 CU_initialize_registry();

 // 3)테스트 레지스트리에 스위트를 추가
 suite = CU_add_suite("[get_date() 함수 테스트]", NULL, NULL);

 // 4)스위트에 테스트 추가
 CU_add_test(suite, "get_name_test_01()", get_name_test_01);
 // 4)스위트에 테스트 추가
 CU_add_test(suite, "get_name_test_02()", get_name_test_02);
 // 4)스위트에 테스트 추가
 CU_add_test(suite, "get_name_test_03()", get_name_test_03);

 // 5) 적절한 인터페이스 예를 사용하여 실행 테스트
 CU_console_run_tests();
 // 6) 테스트 레지스터 정리
 CU_cleanup_registry();

 return 0;

}

 

 

6. 위의 테스트 코드를 넣은 이클립스 화면입니다.

capture03.png

 

7. 실행하기전 프로젝트 프로퍼티 설정

Menu -> Project -> Properties -> C/C++ Build -> Settings

아래와 같이 Libraries(-l)에는 'cunit'을 추가하고, Libray search path(-L)에는 Cunit라이브러리 패스를 추가한다.

capture04.png

 

8. 빌드 실행(컴파일)

capture05.png

[빌드 결과]

capture06.png ]


 

9.실행

capture07.png

실행이 되면 아래와 같이 콘솔창이 뜨고 실행 커맨드를 입력하면 결과 가 보여진다.

capture08.png


10. 소스 수정후 다시 실행

func.c의 switch문의 break를 넣는다.

/*
* func.c
*
* Author: jwjw
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char buff[1024];

char *get_name( char *p_tag){

int n_tag;

n_tag = p_tag[strlen(p_tag)-1]-'0';
memset( buff, 0, sizeof( buff));

switch( n_tag){
 case 3 : strcat( buff, "Name3");
 break;
 case 2 : strcat( buff, "Name2");
 break;
 case 1 : strcat( buff, "Name1");
 break;
 }

return buff;
}

 

[실행 결과]

capture09.png

그림을 많이 넣었더니 더 복잡해진것 같네요. ㅡㅜ

일단 똑같이 한번 따라해보세요.

Cunit을 사용하면서 조금더 쉽게 접근할 수 있는 방법이 있다면 강좌에 다시 적어 보도록 하겠습니다.

감사합니다.