Автоматизация приемочного тестирования с помощью Robot Framework: обзор Robot Framework

Часть 1

Пример: ROBOT FRAMEWORK

В этом разделе представлен короткий пример Robot Framework, который использует систему, над которой мы работали много лет назад. При самой разработке не использовались A-TDD или Robot Framework, то есть пример – новый, система – старая. Это система среднего размера (большие продукты с более сложных или незнакомых доменов сложно использовать в качетсве примера на нескольких страницах.), но, все же, этот пример демонстрирует принципиальные моменты, которые будут актуальными и для среды большего размера.

Robot Framework –фреймворк для автоматизации, использующий keyword-driven подход, созданный Pekka Kl?rck (Ранее Pekka Laukkanen)  в Nokia Siemens Networks в 2005. Одной из его ранних целей была поддержка A-TDD. Он стал бесплатным в 2008 г. и доступен на www.robotframework.org.

Продукт, используемый в нашем случае – информационная система для конференций, разработанная для конференц-центра. Доступ к системе можно получить через «информационные стойки», расположенные по всему конференц-центру.

Посетители могут использовать их для получения актуальной информации о проводимых в данный момент конференциях или самом центре, например следующее:

  • Где мне найти расположение продавца X?
  • Как мне туда добраться?
  • Где расположен ближайший ресторан?
  • Что другие посетители должны сказать о конференции?
Эти стойки поддерживаются и контролируются централизованно. Информация внутри системы должна происходить из существующего процесса подготовки конференции. При обновлении системы для новой конференции разрешается не слишком много дополнительной подготовительной работы — новая система должна адаптироваться к уже существующим системам и способам работы. И, конечно же, система должна быть красивой и яркой— звук, графика и другие прибамбасы.

Пример первый: перечень продавцов 

Первый пример прост, но демонстрирует некоторые принципиальные особенности. Клиент запрашивал возможность перечислить всех продавцов в виде «симпатичного перечня». После абстрактной дискуссии на тему того, что подразумевается под словосочетанием «симпатичный перечень», мы попросили предоставить нам пример. Первый пример был описание рабочего процесса, один (Рис.1.4) с тремя продавцами в базе данных, показанный в виде перечня в алфавитном порядке с тремя колонками.

![Список продавцов|800x588](upload://nNcZ2t1OixOK0mpZ9kNbIjHnBDL.png "Список продавцов")

Рис.  1.4 рабочий пример для выбора продавцов 

Попросив еще несколько примеров (их мы уже не показываем), мы поняли, что предоставленные данные в полученной базе данных, не согласовываются - информационная система должна будет компенсировать это, потому что у нас нет контроля над базой данных. Например, существовала вероятность дублирующихся записей с небольшими отличиями (с логотипом и без).

Описание всех компенсаций данных с примерами с рабочим потоком ведет к бесконечному количеству одинаковых тестов, поэтому мы используем data-driven тесты для этого определенного бизнес-правила, спрашивая, “Какие именно данные в базе данных дадут нам в результате «симпатичный перечень» продавцов?” Результаты показаны в рис. 1.5 a включают примеры сортировки по алфавиту, удаления дублей, и предпочтение записям с логотипом тем, которые логотипа не имеют.

![Расширенный список|800x600](upload://uNewmr41JonJJ0NlzxzNxDRRHxo.png "Расширенный список")

Рис. 1.5 data-driven тест для перечня продавцов 

Короткая пауза— обзор Robot Framework

Следующим шагом должно быть выделение этих примеров в тесты Robot Framework. Но как работает Robot Framework?

Robot тесты написаны в таблицах HTML, TSV, reST или простым текстом. HTML и простой текст – наиболее распространенные форматы. В HTML Robot Framework использует только таблицы и игнорирует дополнительный текст, который может использоваться для документации. Существуют четыре типа таблиц:

  • Таблицы тестовых случаев (test case tables) — содержат фактические тесты. Первое поле этих таблиц должно содержать “Test Case” или “Test Cases.”
  • Таблицы ключевых слов (keyword tables)— содержат низко-уровневые ключевые слова для пользователя, которые могут использоваться для составления тестовых случаев. Первое поле должно содержать ‘Keyword’ или “User Keywords.”
  • Таблицы установок (settings tables)— позволяют импортировать файлы и определять метаданные. Первое поле должно содержать ‘Setting,’ или ‘Settings.’
  • Таблицы переменных (variable tables) — объявление переменных, содержащие глобальные данные, которые могут быть использованы где-то еще. Первое поле должно содержать ‘Variable,’ или ‘Variables.’.

![Таблица с тестом|324x153](upload://pittJx6soRKeguAoOfHo72mVRkM.png "Таблица с тестом")В таблице слева продемонстрирована таблица тестовых случаев с двумя тестами — в первой колонке. Во второй колонке содержатся ключевые слова, а оставшиеся предназначены для изменяющихся аргументов к этим ключевым словам.

В Robot Framework существует два типа ключевых слов: ключевые слова пользователя (user keywords) и ключевые слова библиотеки (library keywords). Ключевое слово пользователя реализуеться в таблице ключевых слов, в то время как ключевое слово библиотеки реализуеться в части связующего кода между тестом и тестируемой системой — под названием библиотека. Таблица не работает потому, что содержит три неопределенных ключевых слова —Drink coffee in liters, Is physical health, and Drink over max amount of coffee.

Таблица справа вводит ключевое слово пользователя “Drink over the max amount of coffee” как пить на один литр больше максимума. ${MAX COFFEE} – переменная, определенная в таблице переменных (не показано).

Выполнение таблицы не проходят потому, что два ключевых слова не определены. Это ключевые слова низшего уровня и применяются как ключевые слова библиотеки в Java (или как альтернатива, в Python).

```python public class CoffeeTestLibrary { Human humanUnderTest = new Human("Bas"); public void drinkCoffeeInLiters(Integer liters) { humanUnderTest.drinkCoffee(liters); } public void isPhysicalHealth(String expectedHealth) throws Exception { if (!expectedHealth.equals(humanUnderTest.checkHealth())) throw new Exception("Health problem. Expected health: " + expectedHealth + " but actual health was " + humanUnderTest.checkHealth()); } } ```

Рисунок ниже показывает основной цикл Robot Framework. Таблицы тестовых случаев и ключевых слов подаются на Robot Framework. Фреймворк вызывает библиотеки, а они вызывают тестируемую систему. Больше информации можно получить в руководстве пользователя по Robot Framework.

Мы отделяем тест от примера на доске. «Обычный» пример удален потому, что он принадлежит к тому же классу эквивалентности что и ‘отсортированный’ тест .

Эти тестовые случаи исполнимы, но они не работают. Robot Framework выдает ошибку, что ключевые слова “Stand input,” “Is stand output,” и “Has No Extra Stands” не определены.

Рис. 1.6 таблица тестовых случаев с перечислением всех продавцов

Ключевые слова могут выполняться как ключевые слова пользователя или библиотек. Мы выбираем выполнить “Is stand output,” и “Has No Extra Stands” как ключевые слова пользователя (Рис. 1.7).

Рис. 1.7 таблица ключевых слов с перечислением всех продавцов

В первом ряду заявлены три аргумента ключевого слова “Is stand output”. Следующий ряд записывает результат ключевого слова “get current logo” в переменную ${actual_logo} и сравнивает ее с expected_logo. Такие же шаги повторяются для других ожидаемых значений. В конце, мы увеличиваем индекс stand.

Когда мы проводим тест сейчас, Robot Framework выдает ошибку, что есть пять неопределенных ключевых слов: stand input, get current logo, get current name, get current place, и stands left. Эти ключевые слова будут реализованны тестовой библиотеке.

Наша тестируемая система написана на C. Мы можем вызвать ее через пользовательский интерфейс (не рекомендуется ), или же мы можем вызвать C код напрямую. Мы выбираем последний вариант и используем тестовую библиотеку в Python потому, что мы можем легко вызвать C напрямую из Python, используя ctypes foreign library . Код тестовой библиотеки:

```python from ctypes import *

class conferencekeywords:
def init(self):
self.conf = cdll.LoadLibrary(“stands.so”)
self.conf.init()
self.stand_index = 0
self.logo_mark = [“”, “x”]
self.conf.get_place_at_index.restype = c_char_p
self.conf.get_name_at_index.restype = c_char_p
def increment_stand_index(self):
self.stand_index = self.stand_index + 1

def stands_left(self):
    return self.conf.stand_output_at(self.stand_index)

def stand_input(self, logo, name, stand):
    has_logo = logo == "x"
    self.conf.add(has_logo, c_char_p(name), c_char_p(stand))    

def get_current_logo(self):
    logo = int(self.conf.get_logo_at(self.stand_index))
    return self.logo_mark[logo]

def get_current_name(self):
    return self.conf.get_name_at_index(self.stand_index)

def get_current_place(self):
    return self.conf.get_place_at_index(self.stand_index)
<p>Код очень простой,  единственное что он делает –вызов C интерфейса.</p><p>Тестируемая система связана с разделяемой библиотекой и загружена с помощью cdll ctypes.</p><p>Результаты записываються в переменную conf и используется для вызова C функций в разделяемой библиотеке. Дополнительный код определяет параметр и тип возврата; это должно быть сделано когда они не являются целыми – значения по умолчанию.</p><p>Когда мы прогоним тесты, они пройдут — если функциональность реализованна.</p><p>&nbsp;</p>

## Часть 3

http://automated-testing.info/t/robot-framework/2313

Часть 3 - примеры http://automated-testing.info/knowledgebase/article/avtomatizacija-priemochnogo-testirovanija-s-pomoshhju-robot-framework-primery-