rein's world

boost::program_options를 사용한 UnitTest++ 커맨드라인 인터페이스

어제 포스팅에서 불편하단 소릴 하긴했지만, 작년 한 해 동안 작성한 테스트 케이스는 전부 이 녀석으로 작성했고, 지금도 잘 돌아가고 있다. _ 수 시간 전에 빌드서버에서 실행된 애들도 있을듯…_

다음과 같은 인자를 받아서 이를 해석하는데, 방식은 *nix의 getopt와 비슷하다. 즉, 

  • --help 에 도움말이 나오고
  • --long-option or -s 처럼 긴 옵션과 짧은 옵션이 같은 의미를 같게 짝 지어져 있고,
  • 대부분의 UNIX 명령어 같은 느낌으로 돈다

 

여튼 내가 만든 녀석은,

  • --suite 혹은 -s 로 실행할 테스트 스윗을 받고 (없으면 몽땅)
  • --testcase 혹은 -t 로 실행할 테스트 케이스 이름을 받고 (역시 없으면 몽땅)
  • --output 혹은 -o 로 테스트 리포트를 받는다. 이게 없으면 콘솔로 있으면 파일로. 그리고 파일 확장자가 .xml 이면 XML 형태로, 아니면 다시 콘솔로 출력한다.

같이 동작한다. 물론 --help도 있다.  

구현 코드는 boost::program_options를 써서 좀 뻔하다.

po::options_description desc("Allowed options");
po::positional_options_description p;
p.add("suite", -1);

desc.add_options()
    ("help", "produce help message")
    ("output,o", po::wvalue<wstring>(&out), "test-report output path")
    ("suite,s", po::wvalue<wstring>(), "test-suite to run")
    ("testcase,t", po::wvalue<wstring>(), "test-case to run");

po::variables_map vm;
po::store(
    po::wcommand_line_parser( argc, argv ).options( desc ).positional(p).run(),
    vm);

po::notify(vm);

이 간단한 코드가 옵션을 정하고 / 이를 해석하는 코드가 된다.1

p.add("suite", -1)은 기본 옵션 — 아무런 옵션 이름을 안주고 인자를 주면 그거에 대한 인자를 준걸로 받아들임 — 을 위해 사용한 것이니 신경쓰지 않아도 된다. 이걸 써서 그리 편하진 않지만 UnitTest++ 로 작성된 테스트 케이스들을 실행하는 커맨드라인 프로그램이 만들어진다.


  1. UTF-16 인코딩된 unicode 기반의 프로그램이라서 wstring을 쓴다. ↩︎