테스팅과 디버깅 방식 정리

종종 큰 프로그램을 만들게 되면 테스팅과 디버깅이 버거워지는데, 매번 관련 항목을 찾기 힘들어서 여기에다가 정리해둔다.

때가 된다면 각 항목에 대해 더 자세히 작성하면 좋겠지만, 정리가 귀찮아서 못하고 있다.

*** 개인적으로 적절한 방식이라고 생각되는 것을 적은 것이기 때문에, 전문적인 방식이 아닐 수 있다!


1. 디버거(Debugger) 사용
가장 기본적인 방식으로 디버거를 이용하여 단계적으로 실행을 하여 분석하는 방법.

1) C & C++: IDE 내장 디버거 또는 GDB
2) Python: PDB 사용



2. 디버깅 모드와 릴리즈 모드를 구분하여 런타임에 값을 출력
매우 심플하면서도 디버거를 모르는 경우에 자주 하는 방식으로, 콘솔로 값을 Print하는 방식이다.
단, 여기서는 디버깅 모드를 사용할 때에만 값을 출력하게 끔 하여, 릴리즈 시에는 이들을 무시하는 방법이다.

1) C & C++
컴파일 시에 디버깅 모드일 경우에는 __DEBUG__ 매크로를 정의하고, 릴리즈 모드일 경우에는 이를 정의하지 않음으로써 아래 구문이 컴파일 되거나 되지 않도록 할 수 있다.
#ifdef __DEBUG__
printf("디버깅 모드");
#endif

2) Python
파이썬의 경우에는 매크로를 지원하지 않을 뿐더러 컴파일 언어가 아니기 때문에 이 방식은 의미가 없다. 굳이 한다면 if 문을 사용할 수 있지만, 무조건 이를 실행하게 되므로 성능 상에서 불리한 점이 있다.



3. 로깅(Logging) 방식
본격적으로 현재 상태를 기록하는 방식이다. 프로그램이 실행됨에 따라서 파일이나 콘솔에 현재 상태를 기록 또는 출력한다.

1) C & C++
C++ 관련 라이브러리에서 표준적으로 많이 쓰는 Logging 라이브러리를 찾을 수 없었다. 따라서 Logging을 한다면 제 3자 라이브러리를 쓰거나, 따로 Logging 라이브러리를 만들어서 써야 한다.

아주 간단한 방식으로는 logging 클래스를 생성하고 logging 클래스에서 파일을 열고, 이 클래스에서 write를 지원하면 된다.

2) Python
Logging 모듈을 지원하므로 이를 쓰면 된다. 더욱이 위에서 디버깅 모드와 같은 방식을 사용하기 힘들기 때문에 로깅 모듈을 사용해야 한다.

다행히도, 실행 시에 --log 옵션을 통해서 로깅의 Level을 지정할 수 있기 때문에 디버깅 모드와 비슷한 방식을 사용할 수 있다.

예를 들어, 일반 실행 중에는 기본 로그 수준을 사용하다가, 디버깅 시에는 --log=DEBUG와 같이 옵션을 주어서 실행되지 않던 로깅 구문들도 작동을 하도록 하면 된다.

그리고 콘솔로 출력하려면 파일 출력 대신에 sys.stdout 출력을 사용하면 된다.



4. 단위 테스트(Unit Test) 방식
디버깅이 아닌 테스팅 방식으로 작성된 기능이 의도된 대로 작동하는지 테스트 하는 방식이다.

1) C & C++
C++의 경우에는 다양한 단위 테스트 Framework가 존재한다. 이를 가져다 쓰면 된다.

2) Python
unittest 모듈을 사용하면 간단히 해결된다.



5. 덤프 파일 생성
가장 Low-Level에 해당하는 방식으로 메모리에 있는 현재 상태를 그대로 파일로 만드는 방식. 생성된 덤프 파일을 분석해서 현재 값이 어떤 지를 분석할 수 있다.

하지만 어렵고 복잡하므로 지금은 패스.

댓글 없음:

댓글 쓰기