우선 간단하게 예시로 ft_strlen 을 들어보겠습니다.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#ifndef MY
# define MY 1
#endif
size_t ft_strlen(const char *s)
{
size_t ret;
ret = 0;
while (s[ret] != 0)
ret++;
return (ret + 1);
}
void *get_strlen()
{
if (MY == 1) // my func
{
return (ft_strlen);
}
else // real func
{
return (strlen);
}
}
int main()
{
//get test func
size_t (*test_strlen)(const char *);
test_strlen = get_strlen();
//test 1
const char *testStr1 = "hello mini tester";
printf("strlen >> input : %s | output : %ld\n", testStr1, test_strlen(testStr1));
}
C
복사
위와 같이 간단하게 ft_strlen 을 작성하고, 미리 define 된 MY 의 값에 따라 원형함수거나,
자신이 만든 함수의 포인터를 리턴해주는 get_strlen() 을 작성합니다.
그 후에 테스트를 위한 메인을 작성합니다.
혹시나 함수포인터에 대해서 공부하신적이 없으시다면,
위 링크에 아주 잘 설명되어있습니다.
위의 예시는 일부러 원형함수와 다른 출력을 내기 위해서
마지막 return 에서 ret + 1 을 리턴해줬습니다.
이후 Makefile 에 다음과 같이 작성해줍니다.
SRCS = \
main.c
test :
@gcc -g ${SRCS} -o test.out -D MY=1
@echo "<< your >> "
@./test.out
@./test.out > my_out.txt
@gcc -g ${SRCS} -o test.out -D MY=0
@echo "<< real >> "
@./test.out
@./test.out > real_out.txt
@echo "===================== diff start ======================"
@diff my_out.txt real_out.txt > diff.txt || true
@cat diff.txt
@rm -rf test.out my_out.txt real_out.txt
@echo "====================== diff end ======================="
Makefile
복사
메이크파일에서 명령어 앞에 @ 를 붙이면,
해당 명령을 그대로 터미널에 적는 것을 방지 할 수있습니다.
아주 간단하게, MY=1 (내가 작성한 ft_strlen 을 사용하도록) 으로 컴파일 하고,
출력을 my_out.txt 에 적고,
이후 MY=0 (원형함수 strlen 을 사용하도록) 하게 컴파일하고, 출력을 real_out.txt 에 적은 후에
간단하게 출력해주고, diff 를 찍어주는 형태입니다.
make test 실행시 출력이 아래와 같습니다.
honlee@ubuntu:~/Desktop/forTest$ make test
<< your >>
strlen >> input : hello mini tester | output : 18
<< real >>
strlen >> input : hello mini tester | output : 17
===================== diff start ======================
1c1
< strlen >> input : hello mini tester | output : 18
---
> strlen >> input : hello mini tester | output : 17
====================== diff end =======================
C
복사
이렇게 원형함수가 이미 존재하는 케이스에서, 자신이 작성한 함수와 원형함수의 출력을
바로바로 비교 할 수 있도록 간단하게 테스터를 작성 할 수 있습니다.
42 과정에서는, libft, ft_printf, ft_container 등 이미 존재하는 함수를 리코딩 할 때 사용하시면
간단히 아웃풋을 비교하면서 코딩 하실 수 있습니다.
또한
#include <stdlib.h>
...
...
...
int main()
{
...
...
//모든 테스트가 끝나고
system("leaks test.out | grep leaked > leak_test.txt");
}
C
복사
위와 같은 코드 (leaks 가 당연히 있어야 합니다.) 와 함께 응용하면, 메모리 릭까지 테스트하게
구성 할 수있습니다.