Можно ли динамически расширять пакет cxxtest во время выполнения?

Я хочу динамически расширить свой CxxTest Suite дополнительными тестовыми элементами, но я нахожу что все сценарии тестирования должны быть доступны (жестко закодированы) во время компиляции.

Мой сценарий заключается в том, что у меня есть довольно громоздкий класс C++, который имеет более 20 методов для тестирования. Этот класс необходимо протестировать для 40+ РАЗНЫХ наборов данных. Эти наборы данных получаются через конструктор класса, управляемый через параметры.

Моя основная цель — избежать повторного написания одних и тех же 20 тестов для разных наборов данных. Я хотел бы использовать управляющий файл, содержащий список наборов данных, и просто создавать разные приборы для одного и того же набора тестов.

Q1) Как динамически (во время выполнения) добавлять дополнительные тесты в набор тестов?

Q2) Можно ли динамически добавлять приборы во время выполнения? Есть ли лучший набор тестов, который позволяет использовать динамические приборы?

Q3) Избегает ли этого метод TDD? Любой получил хорошее резюме техники TDD.

Спасибо,

-- Джей Йоргенсон --


person J Jorgenson    schedule 21.09.2010    source источник


Ответы (1)


На самом деле нет никакого прямого способа сделать это. Количество тестов определяется до времени компиляции, когда вы запускаете cxxtestgen. Он анализирует ваши файлы и находит имена методов, начинающиеся с test. Он также находит TestSuite потомков и генерирует код для однократного создания экземпляра каждого из них. Вы можете написать createSuite функцию для каждого набора тестов, чтобы передавать параметры конструктору набора, но вы по-прежнему ограничены возвратом только одного объекта.

Вы можете изменить настройку сборки, чтобы вызывать тестовую программу 40 раз, каждый раз передавая в командной строке разные параметры. Недостатком этого плана является то, что main по умолчанию, сгенерированный CxxTest, не принимает параметры командной строки. Вам нужно будет предоставить свою собственную реализацию, которая проверяет параметры, а затем вызывает обычный тестовый бегун. Что-то вроде этого:

std::string global_var; // check this in your test cases
int main(int argc, char* argv[]) { // add parameter list
  global_var = argv[1]; // read parameter list
  return CxxTest::ErrorPrinter().run(); // standard CxxTest
}

Чтобы использовать эту функцию, опустите параметр --error-printer при запуске cxxtestgen, добавьте <CxxTest world> в конец файла и используйте параметр --template для создания тестовой программы.

Но пока вы пишете свой собственный main, вы можете попытаться проанализировать свой файл набора данных и там, а затем несколько раз вызвать средство запуска тестов. Что-то вроде этого:

int main() {
  std::fstream dataset("datasetlist.txt");
  int result = 0;
  while (std::getline(dataset, global_var))
    result += CxxTest::ErrorPrinter().run();
  return result;
}
person Rob Kennedy    schedule 03.02.2011