使用CPPUNIT_TEST_SUITE宏时出错

时间:2012-10-22 23:33:58

标签: c++ cppunit

通过阅读CppUnit食谱和大量的谷歌搜索后,我无法弄清楚我得到的特定错误的原因。

我有一个非常基本的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的文件将实例化运行器并运行实际的测试用例。

 // 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 - &gt;

#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中注释掉行号,那么就会出现“suite”未声明的错误。 但接下来是CPPUNIT_TEST_SUITE等宏可用,那为什么会出错呢? 我正在使用-lstc ++,-ldl&amp;进行编译。 -lcppunit flags。

任何帮助表示赞赏!

谢谢!

1 个答案:

答案 0 :(得分: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();中显然,这可能很容易命令行或配置文件驱动,但是你想要实现和控制它。