Автоматизация тестирования UI с помощью SikuliX

Автор: | 04.09.2018

В статье рассмотрен один из подходов к автоматизации тестирования пользовательского интерфейса. Он основан на использования инструмента SikuliX,  языке Python и framework’е для тестирования: unittest.

Постановка задачи

Лучше всего мы учимся и узнаем что-то новое, когда занимаемся конкретной проблемой. Поэтому поставим для себя следующую задачу: протестировать работу штатного калькулятора 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

Для того, чтобы узнать версию Java, которая установлена на вашем компьютере, откройте консоль (нажмите Ctrl+R и введите в окне cmd, либо найдите программу cmd.exe и запустите ее) и выполните в ней команду java -version.

Проверка версии Java

Загрузка SikuliX

Вторым шагом является загрузка дистрибутива SikuliX, для этого перейдите на соответствующую страницу.

Загрузка sikulix

Скачайте последний доступный релиз SikuliX.

Установка SikuliX

Создайте папку, в которую вы хотите установить программу, например C:\SikuliX. Далее, скопируйте туда, скачанный файл sikulixsetup-x.x.x.jar. Введите в строке адреса окна команду cmd.

Запуск консоли из проводника Windows

В результате откроется окно командной строки, в котором указанный нами каталог будет текущим.

Окно консоли

Для запуска установки введите команду:

java -jar sikulixsetup-1.1.2.jar

Установка SikuliX, вид из консоли

Спустя какое время после запуска будет представлено диалоговое окно, в котором, для продолжения установки нужно будет нажать “Yes”.

Подтверждение установки SikuliX

Далее необходимо выбрать одну из опций.

Pack 1 – будут установлены SikuliX IDE и поддержка скриптового языка Python (Jython) и/или Ruby (JRuby).

Pack 2 – будут установлены библиотеки для доступа к функционалу SikuliX из Java, SikuliX IDE установлена не будет.

Выбор опций установки SikuliX

После выбора опции нажмите на кнопку “Setup Now”. Далее вам будет представлена сводная информация по настройкам установки, если согласны, то нажмите “Yes”.

Подтверждение выбранных настроек установки

Запустится процесс установки.

Процесс установки SikuliX

Если вы выбрали опцию Pack 1, то вам будет предложено установить Jython версии 2.7.0, согласитесь с предложенным вариантом (если у вас нет причин отказаться).

Установка Jython

После того, как SikuliX будет установлена со всеми необходимыми компонентами, вы увидите следующее окно.

Завершение установки SikuliX

И сообщение в консоли.

Завершение установки (сообщение в консоли)

Краткий обзор возможностей SikuliX

SikuliX позволяет находить на дисплее графические элементы и использовать их в качестве элементов управления. Например, если вы хотите нажать на кнопку ПУСК в Windows, необходимо в исходный код программы добавить функцию click(), в которую в качестве аргументов передается картинка кнопки ПУСК.

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.Внешний вид 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().

Код метода 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, содержимое которого (если все тесты прошли успешно) будет примерно таким:

Отчет по тестированию

Поделиться
Share on VK
VK
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook
Share on Google+
Google+

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Нажимая на кнопку "Отправить комментарий", я даю согласие обработку персональных данных и принимаю политику конфиденциальности.