Как запустить подмножество модульных тестов в CPPUnit, выбрав их во время выполнения? - PullRequest
6 голосов
/ 06 мая 2010

Я использую CppUnit в качестве основы для модульного тестирования.Можно ли выбрать подмножество тестовых случаев для выполнения во время выполнения?

Есть ли опция фильтрации в CppUnit для этого?

Ответы [ 3 ]

5 голосов
/ 07 мая 2010

Метод TestRunner :: run (), который вы, вероятно, вызываете в main (), на самом деле имеет необязательные параметры: run (std :: string testName = "", bool doWait = false, bool doPrintResult = true, bool doPrintProgress = true ). testName должно быть конкретным именем теста. Вы можете запросить конкретный тест по имени, если хотите. Вы также можете вызвать runTest (Test *) для определенного теста или runTestByName (testName).

Но, похоже, вы хотите стать более изощренным. При условии, что вы зарегистрировали все свои тесты с помощью макросов CPPUNIT_TEST_SUITE_REGISTRATION (), статический метод TestFactoryRegistry :: makeTest () вернет TestSuite всех зарегистрированных тестов.

Объект TestSuite возвращает вектор с помощью метода getTests (). Вы можете перебирать их, сопоставляя их имена с регулярным выражением (или по номеру индекса или как хотите) и вместо того, чтобы вызывать TestRunner :: addTest (registry.makeTest ()) для всего набора, как это делает большинство людей, вы просто добавляете конкретные тесты, которые вы запрашиваете.

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

1 голос
/ 06 мая 2010

Если вы используете GUI Test Runner для cppunit, вы можете просто проверить тесты, которые вы хотите запустить.

Если вы не можете использовать GUI Test Runner, ознакомьтесь с этой публикацией - она ​​описывает «настраиваемый» способ определения тестов для запуска на основе XML-документа (последняя публикация описывает более или менее Решение у меня было в конце).

0 голосов
/ 03 мая 2018

Альтернативный подход:

// find the unit test as specified by the one argument to this program
CPPUNIT_NS::Test *suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
int iTestIndex = 0;
for (; iTestIndex < suite->getChildTestCount(); ++iTestIndex)
{
    fprintf(stderr, "INFO: Looking for a match between '%s' and '%s'\n",
            suite->getChildTestAt(iTestIndex)->getName().c_str(),
            argv[1]);
    if (suite->getChildTestAt(iTestIndex)->getName() == std::string(argv[1]))
    {
        fprintf(stderr, "INFO: Found a match for '%s' and '%s'\n",
                suite->getChildTestAt(iTestIndex)->getName().c_str(),
                argv[1]);
        break;
    }
}
if (iTestIndex >= suite->getChildTestCount())
{
    fprintf(stderr, "ERROR: Did NOT find test '%s'!\n", argv[1]);
    return -1;
}
...