Класс 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-отчетов тестирования. Работа с файлом в ней состоит из набора кейвордов:
- Открыть файл,
- Добавить в файл данные из теста
…
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 совершенно даром.