Ошибка при использовании макроса CPPUNIT_TEST_SUITE

После прочтения кулинарной книги CppUnit и большого количества поиска в Google, я не смог выяснить причину конкретной ошибки, которую я получаю.

У меня есть очень простой класс 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 и запускать реальный тестовый сценарий.

 // 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

Это меня совершенно запутало. Я знаю, что макросы выбираются, потому что, если я закомментирую строку num8 в MyTest.h, то появится необъявленная ошибка "suite". Но тогда доступны макросы CPPUNIT_TEST_SUITE и т. Д., Тогда почему ошибка? Я компилирую с флагами -lstC++, -ldl & -lcppunit.

Любая помощь приветствуется!

Спасибо!

1 ответ

Я еще не определил вашу конкретную проблему, но определил кое-что, что вы могли бы рассмотреть. Ваш 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(); Очевидно, что это может быть легко управляемая командная строка или файл конфигурации, однако вы хотите реализовать и контролировать это.

Другие вопросы по тегам