SlideShare a Scribd company logo
QSpec: тестирование
графических приложений на Qt
Кандров Д.Ю., Пушкова Е.А.
Unipro
C++ Siberia 2016
Задачи тестирования GUI
Задачей тестирования графического интерфейса
пользователя является обнаружение ошибок следующего
характера:
● Ошибки в интерфейсе (несоответствие проектной
документации, отсутствие элементов интерфейса)
● Ошибки в функциональности посредством интерфейса
● Необработанные исключения при взаимодействии с
интерфейсом
● Потеря или искажение данных, передаваемых через
элементы интерфейса
Особенности тестирования GUI
● Тест-планы - сценарии, описывающие действия
пользователя при работе с системой.
● Сценарии пишут, как правило на естественном языке.
● Выполнение тестов при этом производится либо
оператором в ручном режиме, либо системой, которая
эмулирует поведение оператора.
● Проверяется внешнее состояние системы, а не значения
тех или иных внутренних переменных.
Unipro UGENE*
Проект Unipro UGENE - свободное ПО для работы
молекулярного биолога:
● существует 8 лет
● написан на Qt
● более 60 подпроектов (из них 10 - ядро)
● более 4000 функциональных тестов
● более 2000 ручных сценариев (из них ~1200
регрессионных)
* http://ugene.net
Обзор существующих решений
● Squish GUI Tester
● TestComplete
● eggPlant Functional
● AutoIt
● QTest
● QSpec
QTest
● Фреймворк для юнит-тестирования приложений и
библиотек на основе Qt
● Есть все функциональные возможности, обычно
встречающиеся в фреймворках модульного тестирования
● Имеет расширения для тестирования графического
пользовательского интерфейса!
QTest: плюсы
● Поставляется вместе с Qt
● Быстрое создание тестов
● Есть механизм для создания тестов, управляемых
данными (DDT)
● Вместо имитации системных событий, Qt Test отправляет
внутренние события Qt (нет побочных эффектов от
окружения)
QTest: минусы
● Сильно низкоуровневый
● Сложность применения для большого проекта
● Нет менеджера тестов
● Вместо имитации системных событий, Qt Test
отправляет внутренние события Qt
QTest: пример плохой ситуации
Тестовое приложение - калькулятор, у которого скрыта
кнопка “3”.
Тестовый сценарий:
● Сделать 2+3
● Проверить, что результат 5
С использованием QTest, тест
проходит. Однако, обычный человек
его пройти не сможет.
?
QSpec: история создания
Количество сценариев и GUI тестов
QSpec
● Драйвера мыши и клавиатуры для трех систем
● Доступ к объектам осуществляется по QObjectName
● Нет внешнего пускателя тестов
● Логирование через базовые средства Qt
QSpec: Архитектура
QSpec: Архитектура
Использование QSpec: задача
Тестовое приложение - калькулятор.
Тестовый сценарий:
● Сделать 2+3
● Проверить, что результат 5
Сперва проверим есть ли у всех используемых объектов
QObjectName и, если нет, то зададим их.
*Этот шаг нужен и при использовании QTest.
display->
setObjectName("display");
plusButton->
setObjectName("plus");
equalButton->
setObjectName("equal");
Использование QSpec: предварительная
подготовка*
Использование QSpec: добавляем тест
Создаём файлы с тестами и объявляем наш тест:
#define GUI_TEST_SUITE "Calc_base_tests"
TEST_CLASS_DECLARATION(Test1)
#undef GUI_TEST_SUITE
Использование 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"));
....
Использование QSpec: добавляем тест
Реализуем тест:
....
QLineEdit* display =
qobject_cast<QLineEdit*>
(GTWidget::findWidget(os, "display"));
CHECK_SET_ERR(display->text() == "5",
"Result is not equal 5");
}
Использование QSpec: регистрируем тест
Регистрируем тест:
class CalcGUITestsLauncher: public
GUITestsLauncher {
public:
CalcGUITestsLauncher();
};
CalcGUITestsLauncher::CalcGUITestsLauncher():
GUITestsLauncher()
{
guiTestBase.registerTest(new Test1());
}
Использование 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()));
}
Использование QSpec: запуск и результат
Выставляем переменную окружения, чтобы запустить наш
тест:
export HI_GUI_TEST=Calc_base_tests:Test1
Запускаем калькулятор и видим как он работает без нашего
участия.
В консоли видим лог:
....
GT_DEBUG_MESSAGE Checking condition
(display->text() == "5"). Result: OK
Success
Использование QSpec: ошибки
Если повторить тест со скрытой кнопкой “3”, то получим
следующее сообщение в логе:
GT_DEBUG_MESSAGE Checking condition
(display->text() == "5"). Result: FAILED
GT_DEBUG_MESSAGE errorMessage
'result is not equal 5'
QSpec: плюсы
● Честная имитация системных событий на трёх основных
ОС
● Быстрое создание тестов
● Достаточно высокоуровневый интерфейс для работы с
примитивами Qt
● Открытый проект
QSpec: минусы
● Честная имитация системных событий - тесты сильно
зависят от стабильности окружения
● Нет менеджера тестов
● Перегруженное логирование
Планы по развитию проекта
● Пускатель тестов
● Генератор тестов
● Улучшение логирования
○ добавить уровни логирования
○ поддержать разные форматы вывода, чтобы их
понимали CI (например TeamCity)
○ возможно встроить уже готовый логгер
● Такой интерфейс, чтобы легко можно было подменить
QTest и посмотреть результаты тестового прогона на
QSpec
● TDD, на основе Cucumber (совсем светлое будущее)
Спасибо за внимание!
Ваши вопросы?
Адрес проекта: https://github.com/ugeneunipro/QSpec
Почта: dkandrov@unipro.ru
dendrov_kan@gmail.com

More Related Content

KEY
iPhone Unit Testing (Google tool Box)
PPT
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
PDF
Автоматизация UI-тестирования следующего поколения
PDF
Дефицит ресурсов тестирования... или нет?
PDF
Dev collaboration
PPTX
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
PPTX
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
PDF
Badger — инструмент для мониторинга качества продуктов
iPhone Unit Testing (Google tool Box)
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
Автоматизация UI-тестирования следующего поколения
Дефицит ресурсов тестирования... или нет?
Dev collaboration
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
Badger — инструмент для мониторинга качества продуктов

What's hot (20)

PPT
Инструментация среды исполнения в арсенале тестировщика
PPT
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
PDF
XP.Party (iOS) - unit tests frameworks overview
PPTX
ковалев нестандатное нт
PDF
Github Flow. Тестировщики против тестирования
PDF
Как Cluster Membership Software может помочь QA
PPTX
Елена Жукова "Жизнь вне JavaScript"
PDF
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
PPTX
Брич Наталья - Невыносимая переносимость кроссплатформенных приложений на при...
PDF
C&C for coffee'n'code
PDF
Как это будет: ASP.NET Core
PPT
Unit testing
PDF
Константин Васильев «Fody против рутины»
PDF
Selenium grid on-demand
PPTX
DevOps подходы в инфраструктуре автоматизации тестирования
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PPTX
Использование Mock-объектов в TDD на платформе .NET
PDF
Python Development process in Yandex
PPTX
евгения фирсова нерелизное тестирование
PPT
Let's Talk About Junit 5
Инструментация среды исполнения в арсенале тестировщика
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
XP.Party (iOS) - unit tests frameworks overview
ковалев нестандатное нт
Github Flow. Тестировщики против тестирования
Как Cluster Membership Software может помочь QA
Елена Жукова "Жизнь вне JavaScript"
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Брич Наталья - Невыносимая переносимость кроссплатформенных приложений на при...
C&C for coffee'n'code
Как это будет: ASP.NET Core
Unit testing
Константин Васильев «Fody против рутины»
Selenium grid on-demand
DevOps подходы в инфраструктуре автоматизации тестирования
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Использование Mock-объектов в TDD на платформе .NET
Python Development process in Yandex
евгения фирсова нерелизное тестирование
Let's Talk About Junit 5
Ad

Viewers also liked (14)

PPTX
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
PPTX
Теория и практика написания безопасного кода на C++
PPTX
Хитрости мультипоточности
PDF
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
PPTX
Разработка и тестирование интернета вещей. Тренды индустрии
PPTX
Павел Беликов, Как избежать ошибок, используя современный C++
PPTX
о некоторых вопросах бинарной совместимости в C++
PDF
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
ODP
Антон Полухин. C++17
PDF
Clang tidy
PDF
Parallel STL
PPTX
Алексей Кутумов, C++ без исключений, часть 3
PPTX
C++ Core Guidelines
PPTX
Quality assurance of large c++ projects
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Теория и практика написания безопасного кода на C++
Хитрости мультипоточности
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
Разработка и тестирование интернета вещей. Тренды индустрии
Павел Беликов, Как избежать ошибок, используя современный C++
о некоторых вопросах бинарной совместимости в C++
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Антон Полухин. C++17
Clang tidy
Parallel STL
Алексей Кутумов, C++ без исключений, часть 3
C++ Core Guidelines
Quality assurance of large c++ projects
Ad

More from Sergey Platonov (20)

PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PPTX
Григорий Демченко, Универсальный адаптер
PDF
Антон Бикинеев, Reflection in C++Next
PPTX
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
PDF
Василий Сорокин, Простой REST сервер на Qt с рефлексией
PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
PPTX
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
PDF
Антон Бикинеев, Writing good std::future&lt; C++ >
PDF
Павел Филонов, Разделяй и управляй вместе с Conan.io
PPTX
Григорий Демченко, Асинхронность и неблокирующая синхронизация
PDF
Алексей Кутумов, Coroutines everywhere
PPTX
Дмитрий Нестерук, Паттерны проектирования в XXI веке
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PDF
Павел Довгалюк, Обратная отладка
PPTX
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
PPTX
Dori Exterman, Considerations for choosing the parallel computing strategy th...
PDF
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
PPTX
Александр Фокин, Рефлексия в C++
PDF
Антон Нонко, Классические строки в C++
PPTX
Михаил Матросов, Повседневный С++: boost и STL
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Григорий Демченко, Универсальный адаптер
Антон Бикинеев, Reflection in C++Next
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Антон Бикинеев, Writing good std::future&lt; C++ >
Павел Филонов, Разделяй и управляй вместе с Conan.io
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Алексей Кутумов, Coroutines everywhere
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Павел Довгалюк, Обратная отладка
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Фокин, Рефлексия в C++
Антон Нонко, Классические строки в C++
Михаил Матросов, Повседневный С++: boost и STL

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

  • 1. QSpec: тестирование графических приложений на Qt Кандров Д.Ю., Пушкова Е.А. Unipro C++ Siberia 2016
  • 2. Задачи тестирования GUI Задачей тестирования графического интерфейса пользователя является обнаружение ошибок следующего характера: ● Ошибки в интерфейсе (несоответствие проектной документации, отсутствие элементов интерфейса) ● Ошибки в функциональности посредством интерфейса ● Необработанные исключения при взаимодействии с интерфейсом ● Потеря или искажение данных, передаваемых через элементы интерфейса
  • 3. Особенности тестирования GUI ● Тест-планы - сценарии, описывающие действия пользователя при работе с системой. ● Сценарии пишут, как правило на естественном языке. ● Выполнение тестов при этом производится либо оператором в ручном режиме, либо системой, которая эмулирует поведение оператора. ● Проверяется внешнее состояние системы, а не значения тех или иных внутренних переменных.
  • 4. Unipro UGENE* Проект Unipro UGENE - свободное ПО для работы молекулярного биолога: ● существует 8 лет ● написан на Qt ● более 60 подпроектов (из них 10 - ядро) ● более 4000 функциональных тестов ● более 2000 ручных сценариев (из них ~1200 регрессионных) * http://ugene.net
  • 5. Обзор существующих решений ● Squish GUI Tester ● TestComplete ● eggPlant Functional ● AutoIt ● QTest ● QSpec
  • 6. QTest ● Фреймворк для юнит-тестирования приложений и библиотек на основе Qt ● Есть все функциональные возможности, обычно встречающиеся в фреймворках модульного тестирования ● Имеет расширения для тестирования графического пользовательского интерфейса!
  • 7. QTest: плюсы ● Поставляется вместе с Qt ● Быстрое создание тестов ● Есть механизм для создания тестов, управляемых данными (DDT) ● Вместо имитации системных событий, Qt Test отправляет внутренние события Qt (нет побочных эффектов от окружения)
  • 8. QTest: минусы ● Сильно низкоуровневый ● Сложность применения для большого проекта ● Нет менеджера тестов ● Вместо имитации системных событий, Qt Test отправляет внутренние события Qt
  • 9. QTest: пример плохой ситуации Тестовое приложение - калькулятор, у которого скрыта кнопка “3”. Тестовый сценарий: ● Сделать 2+3 ● Проверить, что результат 5 С использованием QTest, тест проходит. Однако, обычный человек его пройти не сможет. ?
  • 10. QSpec: история создания Количество сценариев и GUI тестов
  • 11. QSpec ● Драйвера мыши и клавиатуры для трех систем ● Доступ к объектам осуществляется по QObjectName ● Нет внешнего пускателя тестов ● Логирование через базовые средства Qt
  • 14. Использование QSpec: задача Тестовое приложение - калькулятор. Тестовый сценарий: ● Сделать 2+3 ● Проверить, что результат 5
  • 15. Сперва проверим есть ли у всех используемых объектов QObjectName и, если нет, то зададим их. *Этот шаг нужен и при использовании QTest. display-> setObjectName("display"); plusButton-> setObjectName("plus"); equalButton-> setObjectName("equal"); Использование QSpec: предварительная подготовка*
  • 16. Использование QSpec: добавляем тест Создаём файлы с тестами и объявляем наш тест: #define GUI_TEST_SUITE "Calc_base_tests" TEST_CLASS_DECLARATION(Test1) #undef GUI_TEST_SUITE
  • 17. Использование 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")); ....
  • 18. Использование QSpec: добавляем тест Реализуем тест: .... QLineEdit* display = qobject_cast<QLineEdit*> (GTWidget::findWidget(os, "display")); CHECK_SET_ERR(display->text() == "5", "Result is not equal 5"); }
  • 19. Использование QSpec: регистрируем тест Регистрируем тест: class CalcGUITestsLauncher: public GUITestsLauncher { public: CalcGUITestsLauncher(); }; CalcGUITestsLauncher::CalcGUITestsLauncher(): GUITestsLauncher() { guiTestBase.registerTest(new Test1()); }
  • 20. Использование 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())); }
  • 21. Использование QSpec: запуск и результат Выставляем переменную окружения, чтобы запустить наш тест: export HI_GUI_TEST=Calc_base_tests:Test1 Запускаем калькулятор и видим как он работает без нашего участия. В консоли видим лог: .... GT_DEBUG_MESSAGE Checking condition (display->text() == "5"). Result: OK Success
  • 22. Использование QSpec: ошибки Если повторить тест со скрытой кнопкой “3”, то получим следующее сообщение в логе: GT_DEBUG_MESSAGE Checking condition (display->text() == "5"). Result: FAILED GT_DEBUG_MESSAGE errorMessage 'result is not equal 5'
  • 23. QSpec: плюсы ● Честная имитация системных событий на трёх основных ОС ● Быстрое создание тестов ● Достаточно высокоуровневый интерфейс для работы с примитивами Qt ● Открытый проект
  • 24. QSpec: минусы ● Честная имитация системных событий - тесты сильно зависят от стабильности окружения ● Нет менеджера тестов ● Перегруженное логирование
  • 25. Планы по развитию проекта ● Пускатель тестов ● Генератор тестов ● Улучшение логирования ○ добавить уровни логирования ○ поддержать разные форматы вывода, чтобы их понимали CI (например TeamCity) ○ возможно встроить уже готовый логгер ● Такой интерфейс, чтобы легко можно было подменить QTest и посмотреть результаты тестового прогона на QSpec ● TDD, на основе Cucumber (совсем светлое будущее)
  • 26. Спасибо за внимание! Ваши вопросы? Адрес проекта: https://github.com/ugeneunipro/QSpec Почта: dkandrov@unipro.ru dendrov_kan@gmail.com