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++ 로 작성된 테스트 케이스들을 실행하는 커맨드라인 프로그램이 만들어진다. 뭐 이런 식으로 *nix 명령어/유틸리티스러운 커맨드라인 프로그램을 작성할 때 써먹어도 된다(사실 이 용도로 매우 잘 써먹고있긴하다).

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

Author: rein

나는 ...

Leave a Reply