나도 드디어 유닛 테스트의 세계에 발을 들여놓았다.
여기에는 테스트 같이 사치스러운 일은 존재하지 않았고 앞으로도 존재하기 힘들다. 그동안 귀찮아서 눈 감고 있었는데, 괴로워지는 건 결국 나다. 뭘로 할까하고 고민만 하다가 boost에 유닛 테스트 라이브러리가 있길래 옳타꾸나하고 붙였다. 그런데 boost는 매뉴얼이 부실해서 뭘 어쩌라는 건지 한참 헤맸다.
쓰는 방법은 간단하다. 테스트 메인을 선언하고 매크로를 이용해 테스트 케이스를 추가하면 된다.
테스트 프로세스를 어떻게 꾸밀까 몇가지 생각해봤는데 아래처럼 쓰는 게 좋을 것 같다. 가능한 기존 컴파일 환경을 공유하면서, 테스트 코드와 실제 실행 코드를 분리하고, 테스트에 실패하면 프로그램이 아예 컴파일 되지 않는다.
1. 테스트 메인을 만든다.
1-1. main.cc를 main.test.cc로 복사한다.
1-2. main.test.cc에서 main 함수를 지운다.
1-3. main.test.cc에 대신 다음을 추가한다.
#define BOOST_TEST_MAIN#include <boost/test/included/unit_test_framework.hpp>
2. 테스트 케이스를 만든다.
2-1. 테스트할 소스가 src.cc에 있으면, src.test.cc를 만들고 아래와 같이 테스트 케이스를 작성한다.
#include <boost/test/unit_test.hpp>BOOST_AUTO_TEST_CASE( func ){ BOOST_CHECK_EQUAL( ... );}
3. 테스트가 실패하면 프로그램이 컴파일되지 않도록 Makefile을 수정한다.
3-1. 테스트용 프로그램이 먼저 만들어지도록 한다.
$(TARGET): $(TARGET).test ...
3-2. main.cc를 main.test.cc로 대체하고, 테스트 케이스가 있는 파일을 추가해 컴파일한다.
3-3. 테스트 프로그램을 실행한다. (테스트에 실패하면 여기서 멈추기 때문에 자연스럽게 최종 프로그램이 만들어지지 않는다.)
$(TARGET).test: ......$(TARGET).test
p.s: 유닛 테스트를 처음 적용해보는 거고, boost test 라이브러리도 처음 써보기 때문에 깔끔하지 못한 부분이 있을 겁니다. 좋은 사용법을 알려주시면 감사하겠습니다.