Я начал писать некоторые тесты с системой поблочного тестирования QT.
Как Вы обычно организуете тесты? Это - один тестовый класс в одном классе модуля, или Вы тестируете целый модуль с единственным тестовым классом? Спокойные документы предлагают следовать бывшей стратегии.
Я хочу к тестам записи на модуль. Модуль обеспечивает только один класс, который будет используемым пользователем модуля, но существует большая логика, абстрагированная в других классах, которые я также хотел бы протестировать помимо тестирования общедоступного класса.
Проблема состоит в том что предложенный способ QT запустить тесты, включенные QTEST_MAIN
макрос:
QTEST_MAIN(TestClass)
#include "test_class.moc"
и в конечном счете одна тестовая программа способна к тестированию всего одного тестового класса. И это отчасти сосет для создания тестовых проектов для каждого класса в модуле.
Конечно, можно было смотреть на QTEST_MAIN
макрос, перепишите его и выполните другие тестовые классы. Но есть ли что-то, которое работает из поля?
До сих пор я делаю это вручную:
#include "one.h"
#include "two.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
TestOne one;
QTest::qExec(&one, argc, argv);
TestOne two;
QTest::qExec(&two, argc, argv);
}
Да, QTest заставляет использовать немного странную структуру тестов и в целом уступает Google Test/Mock Framework. Для одного проекта я вынужден использовать QTest (требование клиента), и вот как я его использую:
Настройка этих четырех пунктов очень проста и делает использование QTest почти приятным. Есть ли у вас какие-то проблемы с запуском нескольких тестов, которые не решаются вышеописанным конфигом?
PS: запуск тестов так, как вы делаете, т.е. вызов нескольких QTest::qExec вызывает проблемы с ключом -o командной строки - вы получите результаты только для последнего протестированного класса.
В нашей настройке с QTest мы сделали несколько вещей, чтобы сделать его лучше.
QTest :: qExec ()
. (Мы накапливаем значения, возвращаемые каждый раз, и возвращаем их из нашей функции.) main ()
вызывает эту функцию и возвращает результат как успех / неудача. Эта настройка означает, что экземпляр класса будет создан до запуска main ()
, поэтому он будет добавлен в список классов для тестирования при запуске main. Платформа требует, чтобы вам просто нужно было правильно наследовать свой класс и создать статический экземпляр, если вы всегда хотите, чтобы он работал.
Мы также иногда создаем другие необязательные тесты, которые добавляются на основе параметров командной строки.