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


(Mykhailo Poliarush) #1

Часть 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) с тремя продавцами в базе данных, показанный в виде перечня в алфавитном порядке с тремя колонками.

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

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

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

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

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

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

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

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

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

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

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

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

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

В первом ряду заявлены три аргумента ключевого слова “Is stand output”. Следующий ряд записывает результат ключевого слова “get current logo” в переменную ${actuallogo} и сравнивает ее с 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 . Код тестовой библиотеки:


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)

Код очень простой, единственное что он делает –вызов C интерфейса.

Тестируемая система связана с разделяемой библиотекой и загружена с помощью cdll ctypes.

Результаты записываються в переменную conf и используется для вызова C функций в разделяемой библиотеке. Дополнительный код определяет параметр и тип возврата; это должно быть сделано когда они не являются целыми – значения по умолчанию.

Когда мы прогоним тесты, они пройдут — если функциональность реализованна.

 

Часть 3


Автоматизация приемочного тестирования с помощью Robot Framework: примеры использования
(Mykhailo Poliarush) #2

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