2016-01-19 4 views
3

Я знаю, что модульный тест для Java очень прост. Нам просто нужно использовать JUnit и запускать тестовые классы как тест JUnit.Как использовать cppunit, как junit --- две сети

Теперь я работаю с C++, и я нахожу тестовую библиотеку: cppunit.

Кажется, что мне нужно запустить мой тест с помощью определенной функции main. Однако проект cpp может иметь ТОЛЬКО ОДИН main.

Что мне делать? Мне нужно переключать сеть, когда я выполняю свой тест, и когда я запускаю свой проект?

+1

Забавно, как проект Java может иметь БОЛЬШЕ ЧЕМ ОДНОГО 'main'. Извините, но это всего лишь вопрос того, к чему вы привыкли. Люди, которые выросли на Java, часто удивляются тому, что другие языки не совпадают. –

+1

@PeteBecker Да. Полностью. Если мы будем использовать другой язык, мы обнаружим, что наш мир изменится. – Yves

ответ

7

Что мне делать? Мне нужно переключать сеть, когда я выполняю свой тест, и когда я запускаю свой проект?

Вы должны отделить этот код, чтобы протестировать его в проект библиотеки, который может быть связан с вашим целевым приложением и тестирующим устройством.

Тогда есть еще два проекта обеспечения main() функции:

  • один для целевого приложения, что только вперед main() реализации на вызов функции-члена в MyTargetApp класса, например MyTargetApp::run()
  • один для модульного тестирования, который вызывает TestRunner, и содержит все классы тестов и классы приборов (в том числе для MyTargetApp).

Целевой проект приложения может быть настроен без привязки к библиотеке cppunit и реализациям тестового набора/приспособлений (что, безусловно, уменьшит конечный размер артефактов).


Однако проект каст может иметь только один main.

Другой вариант заключается в использовании только один проект с узкой main() функции, можно скомпилировать с помощью условного оператора препроцессора (как на их примере на TestRunner class):

#ifdef TESTING 
int runUnitTests(int argc, char* argv[]); 
#endif 

int main(int argc, char* argv[]) { 

#ifdef TESTING 
    // run the unit tests 
    // ----------------------------------------------------------------- 
    return runUnitTests(argc,argv); 
#else 
    // run the application 
    // ----------------------------------------------------------------- 
    MyTargetApp app; 
    return app.run(argc,argv); 
#endif 

#ifdef TESTING 
int runUnitTests(int argc, char* argv[]) { 
    std::string testPath = (argc > 1) ? std::string(argv[1]) : ""; 

    // Create the event manager and test controller 
    CppUnit::TestResult controller; 

    // Add a listener that colllects test result 
    CppUnit::TestResultCollector result; 
    controller.addListener(&result);   

    // Add a listener that print dots as test run. 
    CppUnit::TextTestProgressListener progress; 
    controller.addListener(&progress);  

    // Add the top suite to the test runner 
    CppUnit::TestRunner runner; 
    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); 
    try { 
    std::cout << "Running " << testPath; 
    runner.run(controller, testPath); 

    std::cerr << std::endl; 

    // Print test in a compiler compatible format. 
    CppUnit::CompilerOutputter outputter(&result, std::cerr); 
    outputter.write();      
    } 
    catch (std::invalid_argument &e) { 
    // Test path not resolved 
    std::cerr << std::endl 
       << "ERROR: " << e.what() 
       << std::endl; 
    return 0; 
    }   

    return result.wasSuccessful() ? 0 : 1; 
} 
#endif 

Затем у вас есть две различные конфигурации проектов, одна из которых определяет TESTING и одну без нее.

Один из недостатков этого решения заключается в том, что вы оставите все тестовые комплекты модулей и светильники в своей программе, потому что макросы cppunit будут регистрироваться и создавать их автоматически, независимо от того, будет ли он вызван из пути выполнения.

+0

Вы имеете в виду, что я создаю два проекта, один из них - мой проект, а другой - проект, который можно связать с моим проектом и модульными тестами?Что такое проект библиотеки? – Yves

+1

@Thomas На самом деле я имел в виду, что у вас должно быть три проекта: 1. Проект библиотеки, содержащий все материалы, которые необходимо протестировать. 2. Проект приложения, который просто предоставляет тонкую функцию 'main()' и запускает вашу программу. 3. Проект тестового бегуна, который просто запускает модульные тесты. Другой вариант может состоять в том, чтобы иметь единственный 'main()' и помещать условно скомпилированный код, используя директиву '#ifdef TESTING', которая выбирает запуск вашего приложения или запуск модульных тестов. –

+1

Это хорошее предложение. Тогда это действительно похоже на юнит. – erip

Смежные вопросы