Может ли пакет cxxtest динамически расширяться во время выполнения? - PullRequest
1 голос
/ 21 сентября 2010

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

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

Моя основная задача - избежать переписывания одних и тех же 20 контрольных примеров для разных наборов данных. Я хотел бы использовать контрольный файл, который содержит список наборов данных, и просто создать разные приборы для одного и того же набора тестов.

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

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

Q3) Это то, чего избегает техника TDD? Любой получил хорошее краткое изложение техники TDD.

Спасибо,

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

1 Ответ

1 голос
/ 03 февраля 2011

На самом деле нет прямого способа сделать это. Количество тестов определяется до времени компиляции, когда вы запускаете 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;
}
...