2012-10-22 77 views
0

通過閱讀CppUnit食譜和大量的谷歌搜索之後,我一直無法弄清楚我得到的特定錯誤的原因。使用CPPUNIT_TEST_SUITE宏時出錯

我有一個非常基本的CppUnit testFixture類 - > 我有一個文件 - MyTest.h,只有一個TestFixture類定義。

// 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.cpp用於驅動這個MyTest類。

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

然後,一個名爲main.cpp的文件將實例化runner並運行實際的testcase。

// 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安裝程序。 在linux中,我獲得以下奇怪的錯誤 -

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中註釋掉第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,如getRegistry("MyTest").makeTest();顯然,這可能很容易被命令行或配置文件驅動,但是您想實現和控制它。