В статье рассмотрен один из подходов к автоматизации тестирования пользовательского интерфейса. Он основан на использования инструмента SikuliX, языке Python и framework’е для тестирования: unittest.
- Постановка задачи
- Что такое SikuliX?
- Развертывание SikuliX
- Краткий обзор возможностей SikuliX
- Простой пример использования SikuliX
- Разработка приложения выполняющего автоматическое тестирование интерфейса калькулятора Windows
Постановка задачи
Лучше всего мы учимся и узнаем что-то новое, когда занимаемся конкретной проблемой. Поэтому поставим для себя следующую задачу: протестировать работу штатного калькулятора MS Windows (реализация выполнена для Windows 10) в части:
- выполнение простых арифметических действий (сложение, вычитание, умножение и деление);
- извлечение квадратного корня;
- вычисление числа обратного данному.
В качестве инструмента для решения задачи выберем SikuliX.
Что такое SikuliX?
SikuliX – это инструмент для автоматизации действий пользователя, которые он может выполнить при работе с графическим интерфейсом. На сегодняшний день, данный продукт работает в Windows, MacOS, Linux, таким образом, он позволяет протестировать большую часть современных приложений с графическим интерфейсом. SikuliX использует технологию распознавания образов на базе OpenCV для идентификации и управления элементами пользовательского интерфейса.
SikuliX поддерживает следующие языки и технологии, базирующиеся на платформе Java: Python (на базе Jython), RobotFramework, Ruby 1.9 и 2.0 (на базе JRuby), JavaScript (на базе Java Scripting Engine), Scala и т.п. Мобильные платформы пока не поддерживаются, но можно использовать эмулятор для тестирования приложения.
Развертывание SikuliX
Рассмотрим процесс установки SikuliX на операционную систему Windows.
Установка Java
Для начала нужно убедиться в том, что у вас установлена версия исполняемой среды Java 8 (у автора не получилось установить SikuliX с Java 10). Вы можете скачать дистрибутив Java и установить ее с сайта Oracle.
Для того, чтобы узнать версию Java, которая установлена на вашем компьютере, откройте консоль (нажмите Ctrl+R и введите в окне cmd, либо найдите программу cmd.exe и запустите ее) и выполните в ней команду java -version.
Загрузка SikuliX
Вторым шагом является загрузка дистрибутива SikuliX, для этого перейдите на соответствующую страницу.
Скачайте последний доступный релиз SikuliX.
Установка SikuliX
Создайте папку, в которую вы хотите установить программу, например C:\SikuliX. Далее, скопируйте туда, скачанный файл sikulixsetup-x.x.x.jar. Введите в строке адреса окна команду cmd.
В результате откроется окно командной строки, в котором указанный нами каталог будет текущим.
Для запуска установки введите команду:
java -jar sikulixsetup-1.1.2.jar
Спустя какое время после запуска будет представлено диалоговое окно, в котором, для продолжения установки нужно будет нажать “Yes”.
Далее необходимо выбрать одну из опций.
Pack 1 – будут установлены SikuliX IDE и поддержка скриптового языка Python (Jython) и/или Ruby (JRuby).
Pack 2 – будут установлены библиотеки для доступа к функционалу SikuliX из Java, SikuliX IDE установлена не будет.
После выбора опции нажмите на кнопку “Setup Now”. Далее вам будет представлена сводная информация по настройкам установки, если согласны, то нажмите “Yes”.
Запустится процесс установки.
Если вы выбрали опцию Pack 1, то вам будет предложено установить Jython версии 2.7.0, согласитесь с предложенным вариантом (если у вас нет причин отказаться).
После того, как SikuliX будет установлена со всеми необходимыми компонентами, вы увидите следующее окно.
И сообщение в консоли.
Краткий обзор возможностей SikuliX
SikuliX позволяет находить на дисплее графические элементы и использовать их в качестве элементов управления. Например, если вы хотите нажать на кнопку ПУСК в Windows, необходимо в исходный код программы добавить функцию click(), в которую в качестве аргументов передается картинка кнопки ПУСК.
Ниже приведены функции, которые наиболее часто используются при работе с SikuliX.
Функции поиска элементов на экране.
wait(picture [, timeout])
Ожидание появления на экране картинки picture, время ожидания определяется timeout’ом. Если объект не появится, то будет вызвано исключение.
waitVanish(picture [, timeout])
Ожидание исчезновения с экрана картинки picture, время ожидания определяется timeout’ом. Если объект не исчезнет, то будет вызвано исключение.
exists(picture[, timeout])
Ожидание появления на экране картинки picture, время ожидания определяется timeout’ом. Если объект не появится, то будет возвращено значение None. Эту функцию удобно использовать в условных выражениях.
Эмуляция работы с мышью.
click(picture)
Выполняет нажатие левой кнопкой мыши на элементе picture.
doubleClick(picture)
Выполняет двойное нажатие левой кнопкой мыши на элементе picture.
rightClick(picture)
Выполняет нажатие правой кнопкой мыши на элементе picture.
hover(picture)
Выполняет наведение указателя мыши на элемент picture.
Эмуляция нажатий клавиш на клавиатуре.
type([picture, ]text[, modifiers])
Вводит в элемент picture текст – text. Если необходимо, то используются модификаторы – это нажатия клавиш Shift, Ctrl, Alt и т.п. Например, если необходимо нажать клавишу “1” с зажатой Alt, то решение будет выглядеть так type(“1”, KEY_ALT).
Ниже представлен простой пример, демонстрирующий работу SikuliX.
Простой пример использования SikuliX
Создадим простой пример, демонстрирующий одну из возможностей SikuliX. Задача будет состоять в том, что нужно вызвать окно “Выполнить”, ввести в нем “cmd”, нажать Enter и через появившееся окно консоли запустить Notepad.
1. Запустите SikuliX, для этого зайдите в каталог с установленной программой и запустите файл runsikulix.cmd. В результате загрузится оболочка SikuliX IDE.
2. Создайте новый проект, для этого на панели меню выберите File->New.
3. Сохраните созданный проект (мы назовем его prj).
4. Введите исходный код программы.
Особенность SikuliX состоит в том, что она может работать с графическими элементами пользовательского интерфейса, SikuliX IDE предоставляет инструменты для помещения этих элементов в исходный код программы и работы с ними.
Код программы выглядит так:
Как вы может видеть, аргументом функции click() является картинка, для того, чтобы ее туда поместить, установите курсор в нужное место программы, нажмите на кнопку “Take screenshot”, выделите на экране нужную область, и она будет помещена в редактор – в нашем случае как аргумент функции.
В текстовом виде этот код выглядит так:
click("1534932430966.png") sleep(1) type("cmd\n") sleep(1) type("notepad\n") sleep(1) type("Hello! From SikuliX")
Запустите программу, для этого нажмите на кнопку “Run”. Когда программа будет работать – не двигайте мышкой!
Разработка приложения выполняющего автоматическое тестирование интерфейса калькулятора Windows
Для построения тестирующего приложения будем использовать framework для тестирования unittest. Исходный код проекта вы можете загрузить из репозитория, содержимое которого необходимо поместить в папку с установленным SikuliX. Часть исходного кода, размещенного в статье, будет представлена в картинках для большей наглядности.
Framework unittest предоставляет функционал, который значительно упрощает процесс создания и запуска тестов, более подробно можете прочитать здесь.
Создадим два класса BaseActionsTests и ExtendsActionsTests в CalcSimple.sikuli.
Класс BaseActionsTests отвечает за тестирование выполнения базовых операций: сложение, вычитание, умножение и деление. Добавим в этот класс следующие методы, используемые при запуске тестов.
setUpClass() – метод действует на уровне класса BaseActionsTests, запускается один раз перед запуском тестов класса, в нем мы проверяем, запущен ли калькулятор, переводим его в режим “Standart”. Если он не запущен, то запускаем его.
tearDownClass() – метод действует на уровне класса BaseActionsTests, запускается один раз после отработки всех тестов класса, в нем мы ничего не делаем.
setUp() – метод запускается каждый раз перед запуском любого теста, в нем мы тоже ничего не делаем.
tearDown() – метод запускается каждый раз после работы любого теста, в нем будем производить очистку экрана калькулятор, для этого нужно имитировать нажатие кнопки Esc.
Методы непосредственно тестирующие функционал калькулятора имеют следующие имена:
test_add() – тестирование операции “сложение”.
test_sub() – тестирование операции “вычитание”.
test_mul() – тестирование операции “умножение”.
test_div() – тестирование операции “деление”.
Внутренняя архитектура этих методов схожа и выполнена по следующему принципу: последовательно нажимаем на определенные кнопки, например: “1”, “+”, “4”, “=” и смотрим, совпадает ли результат с тем, что мы ожидаем.
Ниже представлен код метода test_add().
Класс ExtendsActionsTests отвечает за тестирование выполнения дополнительных операций: извлечение квадратного корня и операция вычисления обратного элемента. Содержимое методов setUpClass(), tearDownClass(), setUp() аналогично тому, что представлено в классе BaseActionsTests.
Для тестирования функционала в классе ExtendsActionsTests используются следующие методы:
test_sqrt() – тестирование операции “извлечение квадратного корня”.
test_one_div_x() – тестирование операции “вычисление обратного элемента”.
Ниже представлен скриншот IDE с введенным кодом программы.
Создадим проект mainTest.sikuli в той же папке, в которой находится CalcSimple.sikuli. Исходный код проекта mainTest приведен ниже.
import unittest import CalcSimple import StringIO import sys import HTMLTestRunner reload(CalcSimple) # Create list of test cases testList = [] testList.append(CalcSimple.BaseActionsTests) testList.append(CalcSimple.ExtendsActionsTests) testLoad = unittest.TestLoader() # Assemble test cases into suite list caseList = [] for testCase in testList: testSuite = testLoad.loadTestsFromTestCase(testCase) caseList.append(testSuite) # Create TestSuite suite = unittest.TestSuite(caseList) # Run tests if len(sys.argv) > 1 and sys.argv[1] == "html": runner = unittest.TextTestRunner(verbosity=1) filename = "Test1.html" output = open (filename,"wb") runner = HTMLTestRunner.HTMLTestRunner( stream=output, title="Test report" ) runner.run(suite) else: unittest.TextTestRunner(verbosity=2).run(suite)
Кратко рассмотрим содержимое файла.
1. Импортируем необходимые библиотеки.
import unittest import CalcSimple import StringIO import sys import HTMLTestRunner
2. Загружаем модуль CalcSimple.
reload(CalcSimple)
3. Создаем список тестов и заворачиваем их в TestSuite.
# Assemble test cases into suite list caseList = [] for testCase in testList: testSuite = testLoad.loadTestsFromTestCase(testCase) caseList.append(testSuite) # Create TestSuite suite = unittest.TestSuite(caseList)
4. Запускаем тесты.
# Run tests if len(sys.argv) > 1 and sys.argv[1] == "html": runner = unittest.TextTestRunner(verbosity=1) filename = "Test1.html" output = open (filename,"wb") runner = HTMLTestRunner.HTMLTestRunner( stream=output, title="Test report" ) runner.run(suite) else: unittest.TextTestRunner(verbosity=2).run(suite)
Для того, чтобы получить результат тестирования калькулятора в удобочитаемом виде будем использовать HTMLTestRunner.
Для запуска тестирования создайте bat файл со следующим содержимым.
java -Dsikuli.Debug=-2 -jar sikulix.jar -r projects\calcTest\mainTest.sikuli --args html
и поместите этот файл в каталог, рядом с каталогом projects.
Если запустить этот файл, то после прохождения тестов будет создан файл Test1.html, содержимое которого (если все тесты прошли успешно) будет примерно таким:
Ребят, спасибо за то, что создали этот ресурс)
Написано по-человечески – мне не нужно расшифровывать кучу терминов и сленга. И темы те ,что нужнs мне в работе и без лишней воды.
Приобрел книжку по pandas, буду рад, если сделаете уроки по ML на Python.
Добрый день!
Спасибо за отзыв! Про ML мы раздумываем))
Добрый день!
А, где этот файл? у меня скачавается winRaR и все.
Добрый день!
А что конкретно у вас не получается скачать?