Что мне делать? Мне нужно переключать сеть, когда я выполняю свой тест, и когда я запускаю свой проект?
Вы должны отделить этот код, чтобы протестировать его в проект библиотеки, который может быть связан с вашим целевым приложением и тестирующим устройством.
Тогда есть еще два проекта обеспечения 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 будут регистрироваться и создавать их автоматически, независимо от того, будет ли он вызван из пути выполнения.
Забавно, как проект Java может иметь БОЛЬШЕ ЧЕМ ОДНОГО 'main'. Извините, но это всего лишь вопрос того, к чему вы привыкли. Люди, которые выросли на Java, часто удивляются тому, что другие языки не совпадают. –
@PeteBecker Да. Полностью. Если мы будем использовать другой язык, мы обнаружим, что наш мир изменится. – Yves