드디어 대망의 cppUnit 과 CruiseControl.NET 과의 결합입니다. 일단은 개념만 다루기로 하고 다음 포스트에서 프로젝트를 하나 하나 생성해 나가면서, SVN , CI , Schedule , TDD , IssueTracker 까지 적용해서 하나의 프로젝트로 만드는 포스팅 할 예정입니다. (우리 회사에서 적용하고 있는 방법론이기도 합니다, 비용은 인건비만 들고 실용주의 시스템 구성에 돈이 안드는 방법론을 맛볼 수 있습니다.) 저는 맘대로 그 방법을 도입한 형태를 실천주의 구성이라고 합니다 ㅎㅎ

지금까지 cppTest 프로젝트를 하면서 , 화면에 (콘솔) 테스트 결과가 출력되는 형태까지 봐 왔을것입니다. 이제부터 CruiseControl.NET 의 웹 대쉬보드 에 테스트 결과를 출력하게 해서 CI 에 적용되는 프로젝트에 자동화 테스트 까지 추가하기로 하겠습니다.

현재 프로젝트의 환경을 보기로 하지요. (기존의 프로젝트를 CI 에 관리하에 뒀다는 가정하에 진행하겠습니다.)

프로젝트명 : cppTest 
프로젝트위치: d:\user\crazia\cppTest
실행파일위치: d:\user\crazia\cppTest\debug\cppTest.exe


자세한것은 저번 포스트에서 다루고 있습니다. (좀 연재한것이 많아서 링크는 못했습니다.)

처음으로 해야 할 일은 cppTest 프로젝트가 xml 파일을 output으로 내게 하는 일입니다.
역시 cppTest.cpp 파일을 수정해 줍니다.

#include "stdafx.h"
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>
#include <cppunit/XmlOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

#include <fstream>

int _tmain(int argc, _TCHAR* argv[])
{
  CPPUNIT_NS::TestResult controller ;

  CPPUNIT_NS::TestResultCollector result ;
  controller.addListener (&result);

  CPPUNIT_NS::TestRunner runner ;
  runner.addTest(
CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()); runner.run(controller); std::ofstream file("Results.xml"); CPPUNIT_NS::XmlOutputter xml(&result , file); xml.setStyleSheet("report.xsl"); xml.write(); file.close(); return result.wasSuccessful() ? 0: 1;
}



기존 소스와 다른점은 아래쪽에 추가된 부분이라고 할 수 있겠습니다.
Results.xml 을 지정해서 그 파일을 XmlOutPutter 의 결과로 지정해주는 부분입니다.
이렇게 되면 테스트의 상세 결과가 Results.xml 로 저장이 됩니다. stylesheet 를 지정해주는 부분은 옵션입니다. 만약 스타일 쉬트를 지정하게 되면 output 폴더에 꼭 reports.xsl 을 가지고 다녀야 합니다.

자 이제 Test 프로젝트를 준비가 됐으니 다음은 ccnet.config 를 손볼
차례입니다. 이 파일은 보통 %CRUISECONTROL.NET%\server 에 있습니다.
기존의 <devenv> 태그 다음에 다음과 같은 내용을 추가합니다.

   <exec>
        <executable>cppTest.exe</executable>
        <baseDirectory>D:\User\Crazia\Work\cppTest\debug</baseDirectory>
        <buildTimeoutSeconds>10</buildTimeoutSeconds>
    </exec>

위 내용은 프로젝트를 빌드후에 실행해줘야 하는 것을 지정해준
것입니다. 위의 프로그램 예제에서 보여줬듯이 이 방법을 써서 테스트
프로젝트를 실행하면 Results.xml 에 테스트 결과가 저장됩니다. 이 결과를
기존의 빌드로그 가 표시되는 xml 파일에 병합해야 하는 문제가
남았습니다. <task> 태그가 닫히고 난 뒤 같은 레벨에 존재하는 <publishers>
태그가 그 부분을 처리해 줍니다. 정확히는 <merge> 태그 안에 병합할
파일을 써주시면 됩니다. 다음에 그 예제를 적어 뒀습니다.

  <task>
    ...
    <devenv>
      ..
    </devenv>
    <exec>
        <executable>cppTest.exe</executable>
        <baseDirectory>D:\User\Crazia\Work\cppTest\debug</baseDirectory>
        <buildTimeoutSeconds>10</buildTimeoutSeconds>
    </exec>
  </tasks>
  <publishers>
    <merge>
      <files>
        <file>D:\User\Crazia\Work\cppTest\debug\Results.xml</file>
      </files>
    </merge>
    <xmllogger  />
  </publishers>

마지막으로 실제 build report 부분에서 테스트 결과를 볼 수 있게 하는
방법에 대해서 알아보도록 하지요.

이 부분은 이부분 을 참조했습니다. 이 CruiseControl.NET web dashboard 는 빌드
로그를 xsl 파일을 통해서 값을 파싱해서 그 결과값을 화면에
뿌려줍니다. 그래서 기존의 xsl 파일로는 cppUnit 이 만들어 내는 결과를
인식 못합니다. (위에 써둔 Results.xml 을 빌드로그에 병합한 형태를 인식
못함)

따라서 unittest.xsl 를 다운 받아서 %CRUISECONTROL.NET%\webdashboard\xsl
에 넣어줍니다.


사용자 삽입 이미지

위 사진은 모든것이 설정되고 난뒤 빌드 리포트에 생긴 테스트 결과 입니다.

지금까지 cppUnit 과 CruiseControl.NET 과 결합에 대해서 알아보았습니다. 사실 CruiseContorl.NET은 .net 용이기 때문에 cpp 에 관해서는 따로 지원하는 부분이 없습니다. 항상 없는 부분을 만들어 내는 그 부분이 귀찮고 힘들기 때문에 많은 사람들이 포기하기도 합니다. devenv 자체에 포함된 TestProject를 만들 수도 있지만 이것을 사용하면 TDD로 개발이 힘든 부분이 있으며 또한 Test Project 는 XUnit 이 아니라는 점도 마음에 걸려 , 결국 이런 방법을 쓰게 되더군요. 이것때문에 한 일주일간 남는 시간 틈틈이 작업을 한 것 같습니다. ^^; 편하게 할 수 있는 방법들을 찾아서 하세요.
기존의 CruiseControl.NET 에서 TestProject 를 실행해야 하는 경우가 있습니다. 그때는 <task> 블록에서 <exec> 블록을 이용해서 TestProject 의 결과물을 호출합니다.

ccnet.config 에서 <task> 블록에서 <exec> 블록을 추가해줍니다.

     <exec>
  <executable>D:\User\Crazia\Work\win2007d\build\Test2007d.exe</executable>
        <baseDirectory>D:\User\Crazia\Work\win2007d\build</baseDirectory>
        <buildTimeoutSeconds>10</buildTimeoutSeconds>
    </exec>

<executable> 에 실행 파일을 적어주고 <task> 블록안에 넣어주시면 됩니다. 저는 <devenv> 블록 다음에 바로 넣어줬습니다.




+ Recent posts