Денис Кандров, Пушкова Евгения, qspec: тестирование...

26
QSpec: тестирование графических приложений на Qt Кандров Д.Ю., Пушкова Е.А. Unipro C++ Siberia 2016

Upload: sergey-platonov

Post on 06-Jan-2017

255 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: тестирование графических приложений на QtКандров Д.Ю., Пушкова Е.А.Unipro

C++ Siberia 2016

Page 2: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Задачи тестирования GUI

Задачей тестирования графического интерфейса пользователя является обнаружение ошибок следующего характера:

● Ошибки в интерфейсе (несоответствие проектной документации, отсутствие элементов интерфейса)

● Ошибки в функциональности посредством интерфейса● Необработанные исключения при взаимодействии с

интерфейсом● Потеря или искажение данных, передаваемых через

элементы интерфейса

Page 3: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Особенности тестирования GUI

● Тест-планы - сценарии, описывающие действия пользователя при работе с системой.

● Сценарии пишут, как правило на естественном языке.

● Выполнение тестов при этом производится либо оператором в ручном режиме, либо системой, которая эмулирует поведение оператора.

● Проверяется внешнее состояние системы, а не значения тех или иных внутренних переменных.

Page 4: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Unipro UGENE*

Проект Unipro UGENE - свободное ПО для работы молекулярного биолога:

● существует 8 лет

● написан на Qt

● более 60 подпроектов (из них 10 - ядро)

● более 4000 функциональных тестов

● более 2000 ручных сценариев (из них ~1200 регрессионных)

* http://ugene.net

Page 5: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Обзор существующих решений

● Squish GUI Tester

● TestComplete

● eggPlant Functional

● AutoIt

● QTest

● QSpec

Page 6: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QTest

● Фреймворк для юнит-тестирования приложений и библиотек на основе Qt

● Есть все функциональные возможности, обычно встречающиеся в фреймворках модульного тестирования

● Имеет расширения для тестирования графического пользовательского интерфейса!

Page 7: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QTest: плюсы

● Поставляется вместе с Qt

● Быстрое создание тестов

● Есть механизм для создания тестов, управляемых данными (DDT)

● Вместо имитации системных событий, Qt Test отправляет внутренние события Qt (нет побочных эффектов от окружения)

Page 8: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QTest: минусы

● Сильно низкоуровневый

● Сложность применения для большого проекта

● Нет менеджера тестов

● Вместо имитации системных событий, Qt Test отправляет внутренние события Qt

Page 9: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QTest: пример плохой ситуации

Тестовое приложение - калькулятор, у которого скрыта кнопка “3”.

Тестовый сценарий:● Сделать 2+3● Проверить, что результат 5

С использованием QTest, тест проходит. Однако, обычный человек его пройти не сможет.

?

Page 10: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: история создания

Количество сценариев и GUI тестов

Page 11: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec

● Драйвера мыши и клавиатуры для трех систем

● Доступ к объектам осуществляется по QObjectName

● Нет внешнего пускателя тестов

● Логирование через базовые средства Qt

Page 12: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: Архитектура

Page 13: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: Архитектура

Page 14: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: задача

Тестовое приложение - калькулятор.

Тестовый сценарий:

● Сделать 2+3

● Проверить, что результат 5

Page 15: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Сперва проверим есть ли у всех используемых объектов QObjectName и, если нет, то зададим их.

*Этот шаг нужен и при использовании QTest.

display->setObjectName("display");

plusButton->setObjectName("plus");

equalButton->setObjectName("equal");

Использование QSpec: предварительная подготовка*

Page 16: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: добавляем тест

Создаём файлы с тестами и объявляем наш тест:

#define GUI_TEST_SUITE "Calc_base_tests" TEST_CLASS_DECLARATION(Test1)#undef GUI_TEST_SUITE

Page 17: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: добавляем тест

Реализуем тест:

TEST_CLASS_DEFINITION(Test1) {

GTWidget::click(os,GTWidget::findButtonByText(os,"2"));

GTWidget::click(os, GTWidget::findWidget(os,"plus"));

GTWidget::click(os, GTWidget::findButtonByText(os,"3"));

GTWidget::click(os, GTWidget::findWidget(os,"equal"));

....

Page 18: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: добавляем тест

Реализуем тест:

....QLineEdit* display =

qobject_cast<QLineEdit*>(GTWidget::findWidget(os, "display"));

CHECK_SET_ERR(display->text() == "5", "Result is not equal 5");

}

Page 19: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: регистрируем тест

Регистрируем тест:

class CalcGUITestsLauncher: public GUITestsLauncher {public: CalcGUITestsLauncher();};

CalcGUITestsLauncher::CalcGUITestsLauncher(): GUITestsLauncher(){

guiTestBase.registerTest(new Test1());}

Page 20: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: пускатель

Делаем запуск в main-е:

QString runGuiTest = qgetenv("HI_GUI_TEST");

if (!runGuiTest.isEmpty()) {CalcGUITestsLauncher* launcher =

new CalcGUITestsLauncher();tests->

connect(&calc,SIGNAL(si_calculatorShowed()), launcher, SLOT(sl_runTest()));

}

Page 21: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: запуск и результат

Выставляем переменную окружения, чтобы запустить наш тест:export HI_GUI_TEST=Calc_base_tests:Test1

Запускаем калькулятор и видим как он работает без нашего участия.

В консоли видим лог:....GT_DEBUG_MESSAGE Checking condition (display->text() == "5"). Result: OKSuccess

Page 22: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Использование QSpec: ошибки

Если повторить тест со скрытой кнопкой “3”, то получим следующее сообщение в логе:

GT_DEBUG_MESSAGE Checking condition(display->text() == "5"). Result: FAILED

GT_DEBUG_MESSAGE errorMessage 'result is not equal 5'

Page 23: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: плюсы

● Честная имитация системных событий на трёх основных ОС

● Быстрое создание тестов

● Достаточно высокоуровневый интерфейс для работы с примитивами Qt

● Открытый проект

Page 24: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

QSpec: минусы

● Честная имитация системных событий - тесты сильно зависят от стабильности окружения

● Нет менеджера тестов

● Перегруженное логирование

Page 25: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Планы по развитию проекта

● Пускатель тестов● Генератор тестов● Улучшение логирования

○ добавить уровни логирования○ поддержать разные форматы вывода, чтобы их

понимали CI (например TeamCity)○ возможно встроить уже готовый логгер

● Такой интерфейс, чтобы легко можно было подменить QTest и посмотреть результаты тестового прогона на QSpec

● TDD, на основе Cucumber (совсем светлое будущее)

Page 26: Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt

Спасибо за внимание!Ваши вопросы?

Адрес проекта: https://github.com/ugeneunipro/QSpec

Почта: [email protected] [email protected]