понедельник, 4 марта 2013 г.

Разработка функциональных тестов при помощи RobotFramework

Структура статьи:
    1.1. Под Windows.
           *** Settings ***
           *** Variables ***
           *** Keywords ***
           *** Test Cases ***


1. Установка и настройка

Рекомендуется ознакомиться с вводными статьями по использованию RobotFramework (далее сокращенно RF):

Далее описаны шаги для полной установки RobotFramework. Необходимо скачивать инсталляторы только для конкретной системы: 64-х или 32-х битной.

1.1. Под Windows:

  1. Скачать и установить JDK 6: http://www.oracle.com/technetwork/java/javase/downloads/index.html
  2. Добавить переменную окружения JAVA_HOME и установить ей значение - каталог с JDK, например, JAVA_HOME='c:\Program Files (x86)\Java\jdk1.6.0_27\'
  3. Добавить в значение переменной окружения Path строку:;%JAVA_HOME%bin
  4. Скачать и установить Python, v.2.7.3http://www.python.org/, например, в каталог c:\Python27\
  5. Добавить переменную окружения PYTHON_HOME и установить ей значение - каталог с Питоном, например, PYTHON_HOME='c:\Python27\'
  6. Добавить в значение переменной окружения Path строку: ;%PYTHON_HOME%;%PYTHON_HOME%Scripts
  7. Скачать Jython, последнюю стабильную версию, например, v.2.5.2: http://www.jython.org/downloads.html
  8. Для установки Jython в консоли перейти в каталог со скачанным файлом jython_installer-<version>.jar и набрать команду: java -jar jython_installer-<version>.jar, при установке для Installation type выбрать первую опцию All, каталог установки, например, c:\jython25, остальные значения по умолчанию.
  9. Добавить переменную окружения JYTHON_HOME и установить ей значение - каталог с Jython, например, JYTHON_HOME='c:\jython25\'
  10. Добавить в значение переменной окружения Path строку: ;%JYTHON_HOME%;%JYTHON_HOME%bin
  11. Скачать и установить RobotFramework, например, v.2.7.x (robotframework-2.7.1.win32.exe):http://code.google.com/p/robotframework/
  12. Скачать и установить SeleniumLibrary последней версии: http://code.google.com/p/robotframework-seleniumlibrary/downloads/list
  13. Скачать и установить Selenium2Library последней версии (обязателен для поддержки Selenium 2): https://github.com/rtomac/robotframework-selenium2library/downloads
  14. Скачать и установить интегрированную среду разработки RIDE для RobotFramework: http://code.google.com/p/robotframework-ride/
  15. Для возможности запуска RIDE нужно скачать и установить в каталог %PYTHON_HOME%Lib\site-packages надстройку wxPython (например, wxPython2.8-win32-unicode-py27):http://wxpython.org/download.php#stable

1.2. Проверка установки:

  1. Запустить cmd, набрать: java -version, должна появиться информация вида: "java version "1.6.0_27" Java(TM) SE Runtime Environment (build 1.6.0_27-b07) Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)".
  2. Запустить cmd, набрать: python --version, должна появиться информация вида: "Python 2.7.3".
  3. Запустить cmd, набрать: pybot --version, должна появиться информация вида: "Robot Framework 2.7.1 (Python 2.7.3 on win32)".
  4. Запустить RIDE, для этого запустить cmd, набрать: ride.py, должен запуститься RIDE. Для упрощения дальнейшей работы, рекомендуется сделать ярлык быстрого запуска для RIDE. Он запускается файлом %PYTHON_HOME%Scripts\ride.py. При правильно установленном Питоне достаточно просто щёлкнуть по нему.

2. Подготовка к тестированию

Писать тесты для RobotFramework можно как при помощи интегрированной среды разработки RIDE, так и в обычном текстовом редакторе. RobotFramework использует ключевые слова (keywords) для написания тестов. Эти ключевые слова содержатся в стандартных библиотеках: BuiltIn, OperatingSystem, Telnet, Collections, String, Dialogs, Screenshot и в подключаемых внешних библиотеках, таких как Selenium2Library и др.
Хранить и разрабатывать тесты можно в различных форматах. Как наиболее простой рекомендуется формат reStructuredText (reST), в котором тест-кейсы, тест-сьюты, ресурсы и файл инициализации пишутся в обычном текстовом файле с разделением команд и данных двумя пробелами. Для текста должна использоваться кодировка UTF-8. Подробнее о форматах тестовых файлов:
http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html?r=2.7.1#creating-test-data

2.1. Структура тестов RobotFramework

Рекомендуется придерживаться следующей иерархии тестов:
  • Глобальный каталог(общий каталог с тест-кейсами и тест-сьютами всех типов)
    • init-тест (текстовый файл с глобальными переменными, общими настройками для всех тест-сьютов и тестовой документацией)
    • библиотека с ресурсами (текстовый файл, в котором хранятся стандартные команды RF, общие для всех проектов)
    • тест-сьют (текстовый файл, в котором хранятся специфические настройки и переменные для конкретного типа тестов, а также сами тест-кейсы)
    • тест-кейсы (команды, которые непосредственно выполняют отдельные тестовые проверки и хранятся в файле тест-сьюта)
Для реализации предлагаемой иерархии необходимо для каждого проекта:
  1. Создать глобальный каталог <project_work_dir>\test\front_end\rf
  2. Создать в нем текстовый файл __init__.txt. В этом файле ведется тестовая документация. кроме того, RF сразу воспринимаем каталог с таким файлом как каталог с тестами.
  3. Создать или скопировать из другого проекта текстовый файл со стандартными ресурсами (командами RF) resource.txt. В нем должны подключаться все необходимые стандартные библиотеки, указываться глобальные переменные для всех тест-сьютов, реализовываться стандартные проверки.
  4. Создать текстовый файл тест-сьют, например, <project_name>_Test_suite_CRUD.txt, в котором будут храниться тест-кейсы и могут быть описаны локальные переменные, необходимые для работы тест-сьюта. Также здесь подключается файл со стандартными ресурсами resource.txt.
  5. Внутри тест-сьюта в разделе описания тест-кейсов создавать обычные тесты, давая им наименования согласно тест-плана.
После этого можно редактировать тест-кейсы, например, в Notepad++ или выполнить команду "Open Directory" в RIDE, для редактирования всего тестового проекта.

2.2. Возможные разделы в файле с тестами RF и их формат

*** Settings ***

# В данном разделе описываются все подключаемые библиотеки и ресурсы, тестовая документация, настройки тест-сьюта (или тест-кейса).
Например:
*** Settings ***
Documentation     CRUD-тесты. # После этого ключевого слова можно приложить тестовую-документацию. Допускается форматирование * и _ : *полужирное*_курсив__*полужирный курсив*_
Suite Teardown    Close All Browsers    # В конце исполнения тест-сьюта закрываем все браузеры.
Test Teardown     Capture Screenshot    # В случае провала теста - делаем скриншот.
Default Tags      1    # Указание тегов по умолчанию для новых тест-кейсов. В качестве тегов можно использовать разделение тестов по приоритетам или логическим модулям.
Test Timeout      5 minutes    # Таймаут тест-кейсов = 5 мин.
Library           BuiltIn    # Подключаем стандартную библиотеку.
Library           SeleniumLibrary    # Подключаем библиотеку расширения функционала RF, содержащую команды Selenium.
Resource          resource.txt    # Подключаем файл с ресурсами (если они есть).

*** Variables ***

# В данном разделе указываются переменные, которые могут быть глобальными, если они описаны для всего тест-кейса.
Например:
*** Variables ***
${login_doctor}    doctor    # Создаем глобальную переменную login_doctor, с текстовым значением 'doctor'.
${pwd_doctor}     123456    # Создаем глобальную переменную pwd_doctor, с числовым значением 123456. RF делает автоматическое преобразование типов данных, в зависимости от ситуации.
${browser}        ff    # Для выполнения тестов указываем браузер firefox.
${mainProject}    http://10.10.31.14:8080/arm-telemedicine    # Создаем глобальную переменную mainProject, которой присваиваем в качестве значения URL на тестируемый проект.

*** Keywords ***

# В данном разделе на основе имеющихся стандартных команд RF или команд из подключаемых библиотек, могут быть созданы новые составные пользовательские команды.
Например:
*** Keywords ***
Open Login Page    # Название нового пользовательского ключевого слова.
    Open Browser  ${mainProject}  ${browser}    # Открываем браузер и переходим по URL тестируемого проекта.
    Maximize Browser Window    # Разворачиваем браузер на весь экран.
    Set Selenium Speed  500    # Устанавливаем скорость выполнения команд Selenium.
    Title Should Be  Login Page    # Проверям наличие надписи 'Login Page'.
После этого, вместо того, чтобы каждый раз писать в тест-кейсах команды для подключения к страничке авторизации (логина), можно просто писать команду Open Login Page.

*** Test Cases ***

# В данном разделе описываются имена тест-кейсов и команды внутри них. Дополнительно каждый тест-кейс может иметь собственные настройки и локальные переменные.
Например:
0_1_00_000_Enter_system_Main
    [Documentation]    *AUTHOR:* Т.М. Гильмуллин\n*TEST PRIORITY:* 0\n*SPEC ID:* \n*OVERVIEW:* Описываются все глобальные переменные.     # Дополнительная документация по тест-кейсу.
    [Tags]    0    ARM_Main    # Собственные теги тест-кейса.
    Open Login Page    # Используем созданное пользователем ключевое слово.
    Call Selenium Api    waitForPageToLoad    20000    # Используем команду Selenium из подключенной библиотеки SeleniumLibrary.
    Input Text    login    ${login_doctor}    # Вводим логин.
    Input Text    password    ${pwd_doctor}    # Вводим пароль.
    Call Selenium Api    click    //*[@'submit']/input    # Щелкаем на кнопку 'Подтвердить вход'.
Некоторые разделы могут отсутствовать, например, для файла с ресурсами не нужно описывать тест-кейсы, а в файлах тест-кейсов не обязателен раздел ключевых слов. Можно также вообще не разделять тесты RF по отдельным файлам, а все разделы вести внутри одного текстового файла. Кроме того, переменные и ресурсы, описанные в файле __init__.txt не будут доступны во всей иерархии тестов. Это нужно учитывать и описывать глобальные переменные в ресурсах, а локальные переменные - в тест-сьютах.

2.3. Экспорт тестов Selenium в RobotFramework

Тесты, ранее разработанные в Selenium можно перевести в формат RF. Для этого нужно использовать форматер robotframework-rc, оригинал форматера:
http://blog.codecentric.de/en/2012/02/recording-robot-framework-keywords-with-selenium-ide/
Добавление форматера в Selenium IDE:
  1. Открываем настройки форматирования текста: Selenium IDE - Options - Options..., вкладка Formats.
  2. Добавляем новый форматер: нажимаем кнопку Add.
  3. В появившемся диалоге заполняем поля:
    - Name of the format: "robotframework-rc";
    - код самого парсера копируем со странички: https://github.com/denschu/selenium-ide-format-robotframework и вставляем в текстовое поле форматера. Нажимаем Save.
  4. Закрываем диалог опций, перезапускаем Selenium IDE. В меню Selenium IDE - Options - Clipboard Format должен появиться пункт меню robotframework-rc. Выбираем его.
  5. Eсли выделить кусок теста и скопировать его в буфер обмена, то он будет отформатирован по стандарту RobotFramework.
3. Процесс разработки тестов при помощи RobotFrameweork
Можно придерживаться следующего плана разработки тестов для RF:
  1. Описывается алгоритм действий в тесте в виде последовательности шагов, понятных инженеру-тестировщику, аналогично, как описывается задача для ручных тестировщиков.
  2. Например:
    - выполнить такие-то подготовительные действия;
    - запустить такую-то программу;
    - выполнить такой-то сценарий действий;
    - выполнить заключительные действия по формированию лога.
  3. Каждому шагу алгоритма дается понятный перевод, в результате получаем тест-кейс, состоящий из ключевых слов самого высокого уровня (high-level keywords).
  4. В ресурсном файле описываем реализацию этих ключевых слов.
  5. Если не удаётся описать новые ключевые слова используя уже имеющиеся команды RF или для расширения функционала, можно подключить внешние python-модули, в которых реализовать ключевые слова как соответствующие функции.