Автоматизируем gui тесты на питоне

28
Software quality assurance days 20 Международная конференция по вопросам качества ПО sqadays.com Минск. 24–26 ноября 2016 Василий Рябов Aquantia. Нижний Новгород, Россия Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Upload: sqalab

Post on 21-Mar-2017

340 views

Category:

Education


1 download

TRANSCRIPT

Software quality assurance days20 Международная конференция по вопросам качества ПОsqadays.com

Минск. 24–26 ноября 2016

Василий РябовAquantia. Нижний Новгород, Россия

Автоматизируем GUI тесты на питоне:как подружились pywinauto и MS UI Automation

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Автоматизация десктопного GUIЗадачи: (1) уметь управлять GUI приложением

(2) уметь получать текстовые данные из него

Проблема: нет единых стандартов - разные оконные / widget системы

- огромное разнообразие фреймворков и библиотек

Автоматизируем 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()

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Accessibility технологииMS UI Automation

WinForms, WPF, Qt, браузеры,

Store apps (Inspect.exe)

Apple Accessibility APICocoa, ...

AT SPI (через Dbus)Qt, GTK, wxWidgets, ...

Win32 APIMFC, VCL, частично WinForms

(Spy++)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Open Source Tools for Win32 APIAutoIt Большое сообщество, pyautoit (Sep, 2014)

Basic-like language, нет отладчика, нет планов на .NET

AutoHotKey .ahk скрипты (исходный код на C++), есть COM интерфейсpywinauto Чистый Python, красивый ООП, permissive license

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Пример скрипта на pywinauto

Автоматизируем 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 года минимум

Автоматизируем 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)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Проблемы MS UI Automation - Громоздко и сложно для изучения - В .NET интерфейсе есть ошибки, которых нет в нативном (UiaComWrapper) - Custom COM interface (не IDispatch) - Не поддерживает Java AWT/Swing и GTK+

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Решение для PythonIronPython пытались использовать .NET интерфейс

есть ошибка с ArrayList^ (нужен костыль на C#)

CPython пакет comtypes поддерживает custom COM интерфейсы

Ограничения: недогружает регистрацию

custom controls & custom properties

Автоматизируем 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”)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Объект Applicationapp = 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”)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Спецификация окна/контролаWindowSpecification описание критериев поиска (title, class_name, ...)

элемент может ещё/уже не существовать

умеет искать контролы, дожидаться их исчезновения, ...

Wrapper объект, привязанный к реальному контролу

умеет посылать команды, получать данные

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Как создать описание?app.MainWindow.OKapp[“Main Window”][“OK”]app.window(best_match=”Main Window”) \

.child_window(best_match=”OK”)

app.MainWindow.child_window(title=”OK”,

работает быстрее ---> class_name=”Button”)

Автоматизируем 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

Пример для explorer.exe

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Пример для explorer.exe

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Пример для explorer.exe

Автоматизируем 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' ()

Автоматизируем 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”)

Автоматизируем 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)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

GUI тесты это ...

Автоматизируем 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 как сервис

Автоматизируем 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 (кросс-платформенный)

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Ещё больше фичwin32_hooks (a.k.a. hot keys)

работают, но будут улучшены и оттестированы в 0.6.1

Automation Event Handlers (MS UI Automation)обработчики на любое событие (знаем, как сделать)

Тестирование локализаций1 скрипт для разных языков (есть тесты, нет реальных примеров)

Поиск типичных ошибок на окнеесть простые проверки, нужно расширять и ревьюить

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Процесс разработки“Unit” тесты на Windows/Linux (модуль unittest)Cloud Continuous Integration

AppVeyor CITravis CI

Code coverage ~95% (codecov.io)Static analyzers

Landscape.io Quantified Code Codacy

Автоматизируем 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

Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation

Контакты

@gmail.com & Skype: vasily.v.ryabovсайт: pywinauto.github.io

GitHub: pywinauto/pywinautoДоки: pywinauto.readthedocs.io

Русскоязычный чат: room on Gittertag “pywinauto” on StackOverflow