[Заметка] Использование ConnectionCache() при написании библиотек RobotFramework

Класс ConnectionCache() представляет собой кеш состояний для одновременного подключения к серверам, процессов и т.д.
Документацию к нему можно прочитать на сайте readthedocs

Класс ConnectionCache() находится в пакете robot.utils и подключается вот так:

from robot.utils import ConnectionCache

ConnectionCache используется в таких библиотеках, как TelnetLibrary , SSHLibrary. В них кейворд Switch Connection как раз обеспечивает переключение контекста соединения в кеше.

Проблема

Однако, franz-see в библиотеке Database-Library почему-то не стал использовать ConnectionCache. Из-за этого в данной библиотеке можно подключиться только к одной БД.

Рассмотрим пример использования ConnectionCache для организации нескольких одновременных подключения к БД на примере моей библиотеки OracleDB.

Решение

C подключением ConnectionCache мы разобрались. Теперь при инициализации библиотеки нам надо вызвать конструктор этого класса и определить сам контекст соединения:

def __init__(self):
        self._connection = None
        self._cache = ConnectionCache()

При создании кейворда подключения к БД помимо самого соединения необходимо добавить его в кеш. При этом можно указать псевдоним соединения.

def connect_to_oracle (self, dbName, dbUserName, dbPassword, alias=None):
        try:
            logger.debug ('Connecting using : dbName=%s, dbUserName=%s, dbPassword=%s '  % (dbName, dbUserName, dbPassword))
            connection_string = '%s/%s@%s' % (dbUserName,dbPassword,dbName)
            self._connection=cx_Oracle.connect(connection_string)
            return self._cache.register(self._connection, alias)
        except cx_Oracle.DatabaseError,info:
            raise Exception ("Logon to oracle  Error:",str(info))

Переключение между соединениями реализуется через метод switch()

def switch_oracle_connection(self,index_or_alias):
        old_index = self._cache.current_index
        self._connection = self._cache.switch(index_or_alias)
        return old_index

Для закрытия соединений существует метод close_all()

def close_all_oracle_connections (self):
        self._connection = self._cache.close_all()

Данные 4 действия позволят вам создать удобный инструмент управления соединениями в вашей библиотеке.
Полный код OracleDB можно увидеть на GitHub

Дополнение

Однако, ConnectionCache позволяет не только управлять соединениями. Например, мне он помог при написании библиотеки, в которой необходимо было добавлять данные в различные файлы.
Библиотека предназначена для составления специфичных html-отчетов тестирования. Работа с файлом в ней состоит из набора кейвордов:

  1. Открыть файл,
  2. Добавить в файл данные из теста

    n) Закрыть файл.

Для одновременной работы с несколькими файлами я использовал ConnectionCache. Приведу общую концепцию кода для решения задачи.

Как и ранее, в конструкторе инициализируем наш кеш

def __init__(self):
        self._cache = ConnectionCache()    # использование кеша Robot Framework для одновременной работы с несколькими файлами

При создании html добавляем его псевдоним в кеш

def create_html (self,alias, title = 'Simple HTML', add_simple_css = True, add_jquery_min_version = '1.7.0'):
        <skip>
        # регистрация в кеше html с его идентификатором в виде alias
        return self._cache.register(html_root, alias)

В кейворде, который реализует какое-либо добавление данных в файл необходимо указать его псевдоним. При этом в кейворде делается принудительный switch. Рассмотрим пример такого кейворда

def add_custom_html_to_body(self, alias, custom_html):
        """
        Добавление произвольного html в тело страницы
        
        *Args:*\n
        custom_html: html-код, который необходимо вставить в тело страницы
        
        *Example:*
        | add_custom_html_to_body   |   file2   |   <H1>привет</H1> | 
        """
        
        html_root = self._cache.switch(alias)
        custom_html = custom_html.encode('utf-8')
        html_root.body.content = custom_html

Можно было реализовать switch отдельным кейвордом, как в OracleDB, но принудительное указание псевдонима сделано в библиотеке специально для чистоты и понятности кода конечных тестов.

Вывод

Таким образом, ConnectionCache() - это удобный инструмент для организации кеша состояний, который достался нам от RobotFramework совершенно даром.

1 лайк