Тестирование с модулем QTestLib QT

Я начал писать некоторые тесты с системой поблочного тестирования 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);
}
12
задан J P 24 April 2015 в 10:55
поделиться

2 ответа

Да, QTest заставляет использовать немного странную структуру тестов и в целом уступает Google Test/Mock Framework. Для одного проекта я вынужден использовать QTest (требование клиента), и вот как я его использую:

  1. Я компилирую все тесты вместе как поддир шаблона проекта
  2. Чтобы облегчить создание новых тестов, я разделяю много конфигурации проекта с помощью файла common.pri, который я включаю в каждый тестовый .pro файл
  3. Если возможно, я разделяю каталог объектных файлов, чтобы ускорить компиляцию
  4. Я запускаю их все с помощью скрипта batch+awk+sed.

Настройка этих четырех пунктов очень проста и делает использование QTest почти приятным. Есть ли у вас какие-то проблемы с запуском нескольких тестов, которые не решаются вышеописанным конфигом?

PS: запуск тестов так, как вы делаете, т.е. вызов нескольких QTest::qExec вызывает проблемы с ключом -o командной строки - вы получите результаты только для последнего протестированного класса.

4
ответ дан 2 December 2019 в 20:39
поделиться

В нашей настройке с QTest мы сделали несколько вещей, чтобы сделать его лучше.

  • Определите подкласс QObject, который будет использоваться в качестве базового класса для любого нового класса модульного тестирования.
  • В конструкторе этого класса мы добавляем экземпляр теста в статический список тестов, а в деструкторе удаляем его.
  • Затем у нас есть статическая функция, которая просматривает тесты и запускает их, используя QTest :: qExec () . (Мы накапливаем значения, возвращаемые каждый раз, и возвращаем их из нашей функции.)
  • main () вызывает эту функцию и возвращает результат как успех / неудача.
  • Наконец, в модуль компиляции самого конкретного теста мы обычно включаем статический экземпляр этого класса.

Эта настройка означает, что экземпляр класса будет создан до запуска main () , поэтому он будет добавлен в список классов для тестирования при запуске main. Платформа требует, чтобы вам просто нужно было правильно наследовать свой класс и создать статический экземпляр, если вы всегда хотите, чтобы он работал.

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

5
ответ дан 2 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: