65. 테스트 코드 작성하기

이제 콘솔 응용 프로젝트를 생성하여 함수 원형에 맞게 비어 있는 함수를 추가하고 테스트 코드를 작성해 보세요.
함수를 먼저 만들고 테스트 코드를 작성할 수도 있지만 테스트 코드를 먼저 작성하면 팀 작업의 신뢰성을 높일 수 있어요.

먼저 콘솔 응용 프로젝트를 생성하세요.

프로젝트에 main 함수와 테스트 코드를 작성할 Program.c 파일을 추가하세요.
그리고 실습 대상인 함수를 작성할 Common.c 파일과 Common.h를 추가하세요.
소스 파일(.c)에는 함수 정의문을 작성하고 헤더 파일(.h)에는 함수 선언문을 작성할 거예요.
테스트 코드를 작성할 Program.c 파일에서 Common.c 파일에 작성한 함수를 호출하려면 함수 선언문이 필요하죠.
Common.h 파일에는 함수 선언문을 작성할 거예요.

먼저 진입점과 테스트 코드를 작성할 Program.c 파일에 빈 상태의 main 함수를 추가하세요.
물론 Common.h 파일을 포함하여 Common.c 파일에 작성할 함수를 사용할 수 있게 해 줍시다.
◈ Program.c

#include "Common.h"
int main()
{
    return 0;
}

이미 앞에서 약속한 함수 원형에 맞게 Common.h 파일에 함수 선언문을 작성하세요.
그리고 Common.c 파일에는 빈 상태의 함수 정의문을 작성하세요.
컴파일 오류가 없는 상태를 유지하기 위해 반환 형식이 있을 때는 0을 반환하는 코드를 작성하세요.

◈ Common.h

#pragma once
 
//a. 범위 내의 정수 합계를 구하는 함수 
int GetSumInBoundary(int start, int end);
//b. 특정 수가 소수(Prime Number)인지 판단하는 함수
int IsPrime(int num);
//c. 범위 내의 정수중에 소수(Prime Number)의 개수를 구하는 함수
int GetCountIsPrime(int start, int end);
//d. n 개의 정수의 합계를 구하는 함수
int GetSum(int *base, int n);
//e. 두 수를 바꾸는 함수
void Swap(int *a, int *b);
//f. n 개의 정수에서 제일 큰 정수가 있는 메모리 주소를 구하는 함수
int *GetMaxPos(int *base, int n);
//g. n 개의 정수를 크기 순으로 정렬하는 함수(내림차순, 선택 정렬 알고리즘으로 정렬)
void SelectionSort(int *base, int n); 

◈ Common.c

#include "Common.h"
 
int GetSumInBoundary(int start, int end)
{
    return 0;
}
int IsPrime(int num)
{
    return 0;
}
 
int GetCountIsPrime(int start, int end)
{
    return 0;
}
int GetSum(int *base, int n)
{
    return 0;
}
void Swap(int *a, int *b)
{
 
}
int *GetMaxPos(int *base, int n)
{
    return 0;
}
void SelectionSort(int *base, int n)
{
 
} 

이제 여러분은 약속한 함수를 호출하여 정상적으로 작성했는지 확인할 수 있게 테스트코드를 작성하세요.
아직 만들지 않은 함수를 사용하는 테스트 코드를 작성하는 것은 처음 경험하는 이들에게는 낯설고 힘든 작업이 될 수 있어요.

이 부분은 여러분이 생각해서 작성하기 힘들다고 생각하시면 책을 보면서 작성하세요.
어느 정도 책을 보면서 하다가 혼자 할 수 있을 것 같다고 생각하시면 그 때부터는 직접 작성해 보세요.
진입점이 있는 테스트 코드를 작성할 소스 파일에서는 함수마다 테스트하는 함수를 만들어서 호출하는 형태로 작성할게요.

◈ Program.c

#include "Common.h"
void TestGetSumInBoundary(void);
void TestIsPrime(void);
void TestGetCountIsPrime(void);
... 중략 ...
int main()
{
    TestGetSumInBoundary();
    TestIsPrime();
    TestGetCountIsPrime();
    return 0;
}
void TestGetSumInBoundary(void)
{
}
void TestIsPrime(void)
{
}
void TestGetCountIsPrime(void)
{
}
... 중략...

a. 범위 내의 정수 합계를 구하는 함수
사용하는 곳에서 GetSumInBoundary(1,10); 처럼 호출하여 반환 값이 5050이 맞다면 테스트 성공을 출력하고 그렇지 않다면 실패를 출력하면 되겠죠.
물론 현재 함수 정의문은 비어있는 상태이므로 실패를 출력하겠죠.
높은 신뢰성을 추구하기 위해 다양한 경우의 테스트 코드를 작성하는 것은 매우 바람직해요.
여기에서는 단순히 어떻게 테스트 코드를 작성하면 좋은지만 설명하는 수준으로 작성할게요.

void TestGetSumInBoundary(void)
{
    if(GetSumInBoundary(1,100) == 5050)
    {
        printf("GetSumInBoundary 함수 테스트 성공\n");
    }
    else
    {
        printf("GetSumInBoundary 함수 테스트 실패\n");
    }
}

b. 특정 수가 소수(Prime Number)인지 판단하는 함수
여기서는 소수가 아닌 9를 입력 인자로 호출하여 테스트 하는 로직을 작성할게요.

void TestIsPrimeNumber(void)
{
    if( IsPrime(9) == 0)
    {
        printf("IsPrime(9) 함수 테스트 성공\n");
    }
    else
    {
        printf("IsPrime(9) 함수 테스트 실패\n");
    }
}

c. 범위 내의 정수중에 소수(Prime Number)의 개수를 구하는 함수
GetCountIsPrime (5, 20);처럼 호출하여 6이 나오는지 확인하는 코드로 테스트할게요.

if( GetCountIsPrime(5, 20) == 6)
{
    printf("GetCountIsPrime 함수 테스트 성공 \n");
}
else
{
    printf("GetCountIsPrime 함수 테스트 실패 \n");
}

d. n 개의 정수의 합계를 구하는 함수
int arr[6]= {1, 3, 10, 8, 5, 2}; 처럼 정수형을 원소로 하는 배열을 선언하여 배열 이름과 원소 개수를 전달하여 반환 값이 합계와 같은지 확인하세요.

int arr[6] = { 1, 3, 10, 8, 5, 2};
if (GetSum (arr,6) == 29 )
{
    printf("GetSum 함수 테스트 성공\n");
}
else
{
    printf("GetSum 함수 테스트 실패 \n");
}

e. 두 수를 바꾸는 함수
int a=2, b=3; 처럼 선언한 후에 Swap(&a,&b);를 호출하여 값이 바뀌었는지 확인하세요.

int a = 2, b = 3;
Swap(&a,&b);
if( (a==3) && (b == 2))
{
    printf("Swap 함수 테스트 성공 \n");
}
else
{
    printf("Swap 함수 테스트 실패 \n");
}

f. n 개의 정수에서 제일 큰 정수가 있는 메모리 주소를 구하는 함수
int arr[5]= {10, 1100,34,134,100}; 처럼 선언하고 GetMaxPos(arr,5)를 호출하여 반환 결과가 제일 큰 값이 있는 arr+1 인지 확인할게요.

int arr[5]= {10, 1100,34,134,100}; 
if( GetMaxPos(arr,5) == arr+1)
{
     printf("TestGetMaxPos 함수 테스트 성공 \n");
}
else
{
     printf("TestGetMaxPos 함수 테스트 실패 \n");
}

g. n 개의 정수를 크기 순으로 정렬하는 함수(내림 차순으로 정렬, 선택 정렬 알고리즘으로 정렬)
int arr[5]= {10, 1100,34,134,100}; 선언하여 SelectionSort 함수를 호출한 후에 arr의 원소들이 크기 순으로 정렬하였는지 확인할 수 있게 테스트 할게요.

int arr[5]= {10, 1100,34,134,100};
int lcnt=0;
SelectionSort(arr,5);
for(lcnt=0; lcnt<5; lcnt++)
{
    printf("%d \n",arr[lcnt]);
}

여러분은 다양한 형태의 테스트가 필요하거나 다른 방법으로 테스트하는 것이 효과적이라면 테스트 코드를 변경하세요.
여기에서 보여준 코드는 하나의 테스트 예제 코드일 뿐입니다.