Я спрашиваю об этом в надежде, что кто-то был на моем месте и у него есть идеи. Пытаюсь, так сказать, не изобретать велосипед.
Я использую UnitTest++: http://unittest-cpp.sourceforge.net/UnitTest++.html а>
У меня уже написано довольно много тестов, и все они выполняются каждый раз, когда я запускаю тестовую сборку, чего, конечно же, следовало ожидать. Я даже определил свой собственный класс TestReporter, который предоставляет мне немного больше информации о каждом тесте, чем по умолчанию — он печатает время, необходимое для каждого теста в конце, а также имеет цветные сообщения о начале и завершении теста. так мне проще ориентироваться в тестовом выводе.
Но я приближаюсь к моменту, когда огромное количество тестов выдает так много вывода, что буфер моей консоли больше не хранит результаты первых нескольких тестов, и я устал менять этот параметр. Поэтому я хотел бы иметь возможность указать в качестве необязательных аргументов для запуска тестовой сборки тесты, которые я хотел бы запустить, и пропустить другие.
Код для UnitTest++ довольно прост, и я допускаю, что, вероятно, мог бы понять это, если бы я смотрел на него еще немного, но наверняка кто-то уже понял это? Я пытаюсь придумать способ связать мой argv[] с Test::GetTestList(). Я хотел бы отфильтровать список тестов с помощью аргументов командной строки и запустить только эти тесты.
Хм. Похоже, это просто связанный список. Думаю, я могу просто изувечить его... O(m*n) поиска, m=всего тестов, n=указанных тестов. Что ж. Я продолжаю отвечать на свои вопросы. Моды: я опубликую ответ с реализацией моего решения. Надеюсь, это сэкономит кому-то двадцать минут.
Изменить: похоже, мне действительно нужно использовать предикат:
template <class Predicate>
int RunTestsIf(TestList const& list, char const* suiteName,
const Predicate& predicate, int maxTestTimeInMs) const
{
Test* curTest = list.GetHead();
while (curTest != 0)
{
if (IsTestInSuite(curTest,suiteName) && predicate(curTest))
{
RunTest(m_result, curTest, maxTestTimeInMs);
}
curTest = curTest->next;
}
return Finish();
}
Таким образом, я могу просто напрямую использовать RunTestsIf()
.
редактировать: я думаю, что понял это. Ничего себе, первый набег на программирование шаблонов.