От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
Автоматизируем GUI тесты на питоне
1. Software quality assurance days
20 Международная конференция
по вопросам качества ПО
sqadays.com
Минск. 24–26 ноября
Василий Рябов
Aquantia. Нижний Новгород, Россия
Автоматизируем GUI тесты на питоне:
как подружились pywinauto и MS UI
Automation
2. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Автоматизация десктопного GUI
Задачи:
(1) уметь управлять GUI приложением
(2) уметь получать текстовые данные из него
Проблема: нет единых стандартов
- разные оконные / widget системы
- огромное разнообразие фреймворков и библиотек
3. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Известные подходы
1. Координатный метод (autopy, PyAutoGUI)
click(120, 170)
type_keys(“If I was lucky, I'd be at the edit box.”)
2. Распознавание изображений (Sikuli, Lackey)
find(“OK_button.png”).click()
3. Accessibility технологии
btn = window(title_re=”Browse.*”, class_name=”Button”)
btn.get_text()
4. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Accessibility технологии
MS UI Automation
WinForms, WPF, Qt, браузеры,
Store apps (Inspect.exe)
Apple Accessibility API
Cocoa, ...
AT SPI (через Dbus)
Qt, GTK, wxWidgets, ...
Win32 API
MFC, VCL, частично WinForms
(Spy++)
5. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Open Source Tools for Win32 API
AutoIt
Большое сообщество, pyautoit (Sep, 2014)
Basic-like language, нет отладчика, нет планов на .NET
AutoHotKey
.ahk скрипты (исходный код на C++), есть COM интерфейс
pywinauto
Чистый Python, красивый ООП, permissive license
6. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Пример скрипта на pywinauto
7. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
История pywinauto
(2006-2010) Mark McMahon, 32-bit Python, pywinauto 0.4.0
(2010-2011) портирована на 64-битный Python (Intel)
2014 Python 2/3 compatibility (2.6+, 3.3+)
2015 внутренний fork (Intel) вышел как 0.5.0+
2016 MS UI Automation есть в 0.6.0 (31 октября)
есть планы ещё на 2 года минимум
8. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
MS UI Automation
- Native COM interface (UIAutomationCore.dll)
- .NET interface
Open Source Tools:
TestStack.White (C#) - with a long history (563 stars)
Winium.Desktop (C#) - young but good (105 stars)
9. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Проблемы MS UI Automation
- Громоздко и сложно для изучения
- В .NET интерфейсе есть ошибки, которых нет
в нативном (UiaComWrapper)
- Custom COM interface (не IDispatch)
- Не поддерживает Java AWT/Swing и GTK+
10. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Решение для Python
IronPython
пытались использовать .NET интерфейс
есть ошибка с ArrayList^ (нужен костыль на C#)
CPython
пакет comtypes поддерживает custom COM интерфейсы
Ограничения: недогружает регистрацию
custom controls & custom properties
11. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Изменения в pywinauto
Низкоуровневый слой (backend)
“win32” (Win32 API, pywinauto 0.5.4)
“uia” (MS UI Automation, pywinauto 0.6.0+)
Было: app = Application().start(“sample.exe”)
Стало: app = Application(backend=”uia”).start(“sample.exe”)
12. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Объект Application
app = Application().start(“sample.exe”)
app = Application(backend='win32').connect(path=”sample.exe”)
app = Application(backend='uia').connect(title_re=”^.*Sample$”)
app.kill_()
# process-agnostic way
desktop = Desktop(backend=”uia”)
13. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Спецификация окна/контрола
WindowSpecification
описание критериев поиска (title, class_name, ...)
элемент может ещё/уже не существовать
умеет искать контролы, дожидаться их исчезновения, ...
Wrapper
объект, привязанный к реальному контролу
умеет посылать команды, получать данные
14. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Как создать описание?
app.MainWindow.OK
app[“Main Window”][“OK”]
app.window(best_match=”Main Window”)
.child_window(best_match=”OK”)
app.MainWindow.child_window(title=”OK”,
работает быстрее ---> class_name=”Button”)
15. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Подъёмник за гобеленом
app.Properties.OK.click()
работает так же, как
app.Properties.OK.wrapper_object().click()
Но:
app.Properties.OK возвращает WindowSpecification
app.Properties.OK.wrapper_object() ← ButtonWrapper
17. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Пример для explorer.exe
18. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Пример для explorer.exe
19. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Где взять имена для доступа?
app.MainWindow.print_control_identifiers()
ComboBox - 'Gray' (L789, T594, R906, B615)
'Border sizeComboBox' 'ComboBox' ()
Button - 'Set' (L1083, T592, R1157, B615)
'Button' 'Button0' 'Button1' 'Set' 'SetButton' ()
Button - 'OK' (L1048, T695, R1123, B718)
'Button2' 'OK' 'OKButton' ()
Button - 'Cancel' (L1129, T695, R1204, B718)
'Button3' 'Cancel' 'CancelButton' ()
20. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Способы делать магию
1. By title: app.Properties.OK.click()
2. By title+type: app.PropertiedDialog.OKButton.click()
3. By type+index: app.Properties.Button3.click()
4. By top-left label: app.SaveAs.FileNameEdit.set_text(“”)
5. By item text:
app.Properties.TabControlSharing.select(“General”)
21. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Обработка ожиданий
window = app.Window_(title=”Main Window”)
window.wait(“active”, timeout=20)
window.wait_not(“visible enabled”)
window.exists() / .visible() / .enabled() / .active()
# wait until CPU usage < 2%
app.wait_cpu_usage_lower(threshold=2, timeout=10)
22. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
GUI тесты это ...
23. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Общие проблемы GUI Automation
Нужен активный desktop
чтобы работал ввод: click_input(), type_keys(“”)
Разовый запуск по RDP (Remote Desktop)
держим RDP не свёрнутым, не в полном экране → OK
Для регулярного запуска под Continuous Integration в лабе
настраиваем autologon
ставим VNC server (можно делать безопасный disconnect)
не запускаем Jenkins slave как сервис
24. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Другие платформы
Linux (есть pyatspi2 и LDTP)
реализованы mouse/keyboard модули через python-xlib
AT SPI: пока только планы
OS X (есть pyatom)
простой прототип для окон верхнего уровня
Java (есть Jemmy на Java)
Python-to-Java bridge: JPype (кросс-платформенный)
25. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Ещё больше фич
win32_hooks (a.k.a. hot keys)
работают, но будут улучшены и оттестированы в 0.6.1
Automation Event Handlers (MS UI Automation)
обработчики на любое событие (знаем, как сделать)
Тестирование локализаций
1 скрипт для разных языков (есть тесты, нет реальных примеров)
Поиск типичных ошибок на окне
есть простые проверки, нужно расширять и ревьюить
26. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Процесс разработки
“Unit” тесты на Windows/Linux (модуль unittest)
Cloud Continuous Integration
AppVeyor CI
Travis CI
Code coverage ~95% (codecov.io)
Static analyzers
Landscape.io Quantified Code Codacy
27. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Благодарности
Valentin Kroupkin (Auckland, New Zeland)
MS UI Automation, тесты, Continuous Integration & more
Denis Matiychuk (Kharkiv, Ukraine)
GUI инспектор объектов + генератор кода: SWAPY
Alexander Rumyantsev (Lobachevsky State University, NN)
MS UI Automation, multi-backend
Ivan Magazinnik (Lobachevsky State University, NN)
модули mouse/keyboard на Linux
28. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
Контакты
@gmail.com & Skype: vasily.v.ryabov
сайт: pywinauto.github.io
GitHub: pywinauto/pywinauto
Доки: pywinauto.readthedocs.io
Русскоязычный чат: room on Gitter
tag “pywinauto” on StackOverflow