2012-10-22 8 views
0

CppUnit 요리 책을 읽고 많은 인터넷 검색 결과를 얻지 못하면서 내가 겪고있는 특정 오류의 원인을 파악할 수 없었습니다.CPPUNIT_TEST_SUITE 매크로를 사용하는 동안 오류가 발생했습니다.

매우 기본적인 CppUnit testFixture 클래스가 있습니다. -> TestFixture 클래스 정의 외에는 MyTest.h 파일이 있습니다.

// MyTest.h 
#include <cppunit/ui/text/TestRunner.h> 
#include <cppunit/extensions/TestFactoryRegistry.h> 
#include <cppunit/extensions/HelperMacros.h> 

class MyTest : public CppUnit::TestFixture 
{ 
    CPPUNIT_TEST_SUITE(MyTest); // Line num 8 
    CPPUNIT_TEST(TestFailure); 
    CPPUNIT_TEST_SUITE_END(); 

    public: 
    void TestFailure() 
    { 
     CPPUNIT_ASSERT(false); 
    } 
}; 

또한이 MyTest 클래스를 구동하는 MyTest.cpp.

// MyTest.cpp 
#include "MyTest.h" 

그러면 runner를 인스턴스화하고 실제 테스트 케이스를 실행하는 main.cpp 파일이 생성됩니다.

// main.cpp 

#include <cppunit/ui/text/TestRunner.h> 
#include <cppunit/extensions/TestFactoryRegistry.h> 
#include <cppunit/extensions/HelperMacros.h> 

// In my main, I define a macro ADD_TEST and do #include of file called "testList.h" 
// So my testList.h can have any number of ADD_TEST macros. 
int main(int argc, char **argv) 
{ 
     CppUnit::TextUi::TestRunner runner; 

     #define ADD_TEST(_testName) \ 
       runner.addTest(_testName::suite()); 
     #include testList.h" 
     #undef ADD_TEST 

     runner.run(); 
     return true; 
    } 

가 여기 내 testList.h입니다 ->

#pragma once 
#include MyTest.h 

ADD_TEST(MyTest) 

이제,이 파일 구조가 작동합니다 - Windows 설치에서와 같이. 리눅스에서 , 나는 이상한 오류를 다음 얻을 -

MyTest.h: In function 'int main(int, char**)': MyTest.h:8: error: 'main(int, char**)::MyTest' uses local type 'main(int, char**)::MyTest' 
MyTest.h:8: error: trying to instantiate 'template<class Fixture> class CppUnit::TestSuiteBuilderContext' 
MyTest.h: In static member function 'static void main(int, char**)::MyTest::addTestsToSuite(CppUnit::TestSuiteBuilderContextBase&)': 
MyTest.h:8: error: cannot convert 'CppUnit::TestSuiteBuilderContextBase' to 'int' in initialization 

이 날 완전히 혼란에 있습니다. 나는 매크로가 픽업되는 것을 안다. MyTest.h의 Line num8을 주석 처리하면, "suite"선언되지 않은 에러가 발생하기 때문이다. 그렇다면 CPPUNIT_TEST_SUITE 등 매크로를 사용할 수 있습니까? 그 이유는 무엇입니까? -lstC++, -ldl & -lcppunit 플래그로 컴파일 중입니다.

도움을 주셨습니다.

감사합니다.

답변

0

아직 귀하의 특정 문제를 확인하지는 못했지만 귀하가 고려해야 할 사항을 밝히지 않았습니다. 귀하의 ADD_TEST는 CppUnit 테스트 레지스트리가 당신을 위해 설계된 것을 처리하는 매우 수동 방법입니다. CPPUNIT_TEST_SUITE (MyTest)를 호출 한 이유; 매크로는 테스트를 프레임 워크에 등록하여 런타임에 얻을 수 있습니다.

은 다음과 같습니다 대신 주요 고려 :

int main(int argc, char **argv) 
{ 
    CppUnit::TextUi::TestRunner runner; 
    CppUnit::Test *test = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); 

    runner.addTest(test); 
    runner.run(); 
    return true; 
} 

당신이 멋진 싶어 실행되는 테스트를 위해, 당신의 매개 변수로 특정 테스트 이름을 전달하여 그들을 선택할 수있는 다양한 선택을 제공하는 경우 getRegistry, as getRegistry("MyTest").makeTest(); 분명히 이것은 명령 행이나 구성 파일을 쉽게 구동 할 수 있지만 구현하고 제어하려고합니다.

관련 문제