Search
Duplicate

리코딩 시 Makefile 을 이용한 간단한 테스터 작성하기 (feat. 원형함수)

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
개발지식
Scrap
태그
9 more properties
우선 간단하게 예시로 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 가 당연히 있어야 합니다.) 와 함께 응용하면, 메모리 릭까지 테스트하게
구성 할 수있습니다.