Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,938 views

Published on

Доклад Василия Рябова на конференции SQA Days-20. 24-26 ноября 2016. Минск
www.sqadays.com

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Software quality assurance days 20 Международная конференция по вопросам качества ПО sqadays.com Минск. 24–26 ноября Василий Рябов Aquantia. Нижний Новгород, Россия Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation
  2. 2. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Автоматизация десктопного GUI Задачи: (1) уметь управлять GUI приложением (2) уметь получать текстовые данные из него Проблема: нет единых стандартов - разные оконные / widget системы - огромное разнообразие фреймворков и библиотек
  3. 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. 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. 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. 6. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Пример скрипта на pywinauto
  7. 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. 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. 9. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Проблемы MS UI Automation - Громоздко и сложно для изучения - В .NET интерфейсе есть ошибки, которых нет в нативном (UiaComWrapper) - Custom COM interface (не IDispatch) - Не поддерживает Java AWT/Swing и GTK+
  10. 10. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Решение для Python IronPython пытались использовать .NET интерфейс есть ошибка с ArrayList^ (нужен костыль на C#) CPython пакет comtypes поддерживает custom COM интерфейсы Ограничения: недогружает регистрацию custom controls & custom properties
  11. 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. 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. 13. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Спецификация окна/контрола WindowSpecification описание критериев поиска (title, class_name, ...) элемент может ещё/уже не существовать умеет искать контролы, дожидаться их исчезновения, ... Wrapper объект, привязанный к реальному контролу умеет посылать команды, получать данные
  14. 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. 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
  16. 16. Пример для explorer.exe
  17. 17. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Пример для explorer.exe
  18. 18. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Пример для explorer.exe
  19. 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. 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. 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. 22. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation GUI тесты это ...
  23. 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. 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. 25. Автоматизируем GUI тесты на питоне: как подружились pywinauto и MS UI Automation Ещё больше фич win32_hooks (a.k.a. hot keys) работают, но будут улучшены и оттестированы в 0.6.1 Automation Event Handlers (MS UI Automation) обработчики на любое событие (знаем, как сделать) Тестирование локализаций 1 скрипт для разных языков (есть тесты, нет реальных примеров) Поиск типичных ошибок на окне есть простые проверки, нужно расширять и ревьюить
  26. 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. 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. 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

×