Dharma
[CppUnit] CppUnit 과 CruiseControl.NET 과의 결합 본문
드디어 대망의 cppUnit 과 CruiseControl.NET 과의 결합입니다. 일단은 개념만 다루기로 하고 다음 포스트에서 프로젝트를 하나 하나 생성해 나가면서, SVN , CI , Schedule , TDD , IssueTracker 까지 적용해서 하나의 프로젝트로 만드는 포스팅 할 예정입니다. (우리 회사에서 적용하고 있는 방법론이기도 합니다, 비용은 인건비만 들고 실용주의 시스템 구성에 돈이 안드는 방법론을 맛볼 수 있습니다.) 저는 맘대로 그 방법을 도입한 형태를 실천주의 구성이라고 합니다 ㅎㅎ
지금까지 cppTest 프로젝트를 하면서 , 화면에 (콘솔) 테스트 결과가 출력되는 형태까지 봐 왔을것입니다. 이제부터 CruiseControl.NET 의 웹 대쉬보드 에 테스트 결과를 출력하게 해서 CI 에 적용되는 프로젝트에 자동화 테스트 까지 추가하기로 하겠습니다.
현재 프로젝트의 환경을 보기로 하지요. (기존의 프로젝트를 CI 에 관리하에 뒀다는 가정하에 진행하겠습니다.)
프로젝트위치: 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> 태그 다음에 다음과 같은 내용을 추가합니다.
<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 이 아니라는 점도 마음에 걸려 , 결국 이런 방법을 쓰게 되더군요. 이것때문에 한 일주일간 남는 시간 틈틈이 작업을 한 것 같습니다. ^^; 편하게 할 수 있는 방법들을 찾아서 하세요.