Как стать автором
Обновить

Комментарии 21

Спасибо! Очень актуально. Сам на выходных искал простенький «Getting started».
Разъясните, пожалуйста, для адептов VS следующее:
Добавляем модуль testlib и gui (надо для тестирования GUI) к .pro-файлу.

Да и про добавление дочернего проекта для тестирования, если несложно.
1. Открываете .pro файл (это файл проекта на qt используемый как qtcreator, так и собственно qmake) и дописываете в него директиву QT:
QT += testlib gui

таким образом вы подключаете необходимые модули.

2. Qt поддерживает иерархию проектов для этого в корневом .pro-файле следует указать директиву SUBDIRS и перечислить все подпроекты, которые должны принадлежать корневому проекту, естественно в каждом подпроекте должен быть свой .pro-файл. Когда вы дадите команду на сборку корневого проекта все подпроекты будут собраны в указанном порядке.
1. Создаете основной проект.
2. В папке основного проекта создаете проект tests, там появится папка tests с самим тестовым проектом.
3. Работаете в тестовом проекте.
4. Когда все готово, добавляете в основной .pro-файл строчку: SUBDIRS += tests.
5. Теперь при сборке проекта, будут собираться тесты.
Для адептов VS QtTest(d)4.lib и QtGui(d)4.lib в Input вкладки Linker в Properties
А проект есть проект, создаете новый проект в студии и вешаете на него зависимость от основного функционала. Студия не имеет иерархии проектов
В студии можно устанавливать зависимости между проектами. Тогда зависимый проект будет собираться строго после того, от которого он зависит.
При генерации sln из subdirs можно сделать так:
qmake proj.pro -tp vc -r
тогда qmake рекурсивно пройдет по всем проектам subdirs и осздаст .sln файл + набор .vcproj файлов для каждого субпроекта. При этом порядок сборки будет определен порядком подключения субпроектов в subdirs. Но почему-то в обратном порядке :)

Делал так, это работает.
спасибо за статью. сравнение двух чисел это, конечно, показательный пример, но хотелось бы более сложных сценариев тестирования. например, асинхронный доступ к веб-сервису, работа с бд, тестирование ui
Тестирование ui описано в последней части поста, может и слабо. Но я думал, принцип понятен. Там все просто, только симуляция ивентов. Например QTest::keyClicks(..). А более сложные примеры точно так же и работают. То, что вы описали: асинхронный доступ к веб-сервису, работа с бд, это все реализуется не в тестовых классах, а в тестируемом классе. В нем может быть что угодно. Тестировать можно все что угодно. Методы Q_COMPARE, Q_VERIFY и т.д.
Для тестирования асинхронных запросов отлично подходит класс QSignalSpy, работа с БД вообще не представляет ничего сложного — отправил запрос, получил ответ, сравнил полученный результат с ожидаемым. Для тестирования Ui именно в понимании Ui т.е. размещения объектов на форме и прочего дизайна существует утилита Squish от froglogic, к сожалению не бесплатная, впрочем, они предоставляют 30-дневный триал.
Асинхронный доступ к веб сервису и работа с БД выходит за рамки UT.
НЛО прилетело и опубликовало эту надпись здесь
А никак. Нет их тут.
Кстати, Google Testing Framework и Google Mock Framework очень не плохо работают в паре с QTestLib, так что если нужны mock'и то рекомендую посмотреть в эту сторону.
Один вопрос, а как лучше влезать в приватные методы у тестируемых классов?
Только неявным способом, unit тестирование предполагает тестирование public API.
Кстати, если нужно дотянутся до приватного члена класса, то очень помогает метод QObject::findChild()
findChild же помогает вытянуть всякие классы, которые не живут в паблике. Помню какой-то дефайн позволял в случае чего friend'ом обьявлять тестовый класс.
И часто бывает, что класс то не совсем самостоятельный, а часть чего-то большого, вот тут приходится или наследника городить или с приватными членами извращаться.
Не помню где, но видел очень остроумное решение: #define private public
Хотя тестировать приватные члены не правильно.
Подобное решение может быть чревато потенциальными проблемами, но да, я тоже встречал такой подход.
Какие могут быть проблемы с деинкапсуляцией класса в тесте?
Вы просили оставлять любые комментарии по статье, чтобы вы повышали качество их написания.

Есть у вас в статье несколько предложений (в начале), которые подобны этому:
Я чаще использую первый метод, второй — уродлив. Но сегодня я вам покажу на примере второго метода, а первый метод распишу сейчас.

Стилистически и логически предложения не совсем верные. Я не знаток родной речи, но сами формулировки можно упростить. Написать тоже самое более последовательно.

Содержание статьи отличное! Желаю дальнейших творческих успехов.
public slots:
int max(int a, int b);
int min(int a, int b);


Есть вопрос по поводу используемого примера: какой сакральный смысл объявлять эти методы в слотах? Каким образом они вернут результат если использовать сигналы?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации