Проблема
Зачастую тестировщики используют в тестах статические переменные, реже – списки и словари.
Однако, рано или поздно возникает ситуация, когда в тесте необходимо получить переменную, значение которой вычисляется динамически.
Это может быть random, строка из файла или значение из таблицы БД.
Рассмотрим, как можно организовать datapool на основе таблицы БД, используя возможности variablefile и OracleDB
Решение
В простейшем случае мы могли бы написать примерно такой код в кейворде Robot Framework
OracleDB.connect_to_oracle dbname dbuser dbpassword
@{username}= OracleDB.execute_sql_string select username from usertable where id=1
Log ${username[0][0]}
OracleDB.disconnect_from_oracle
Это уже можно было бы назвать реализацией datapool, однако этот код слишком прост лишён магии.
Ниже я покажу, как можно вместо этого написать лаконичный и легко используемый код.
Применяя расширенные возможности файлов переменных, напишем такод python-код в файле var.py
# -*- coding: utf-8 -*-
from OracleDB import OracleDB
class database:
def get_username(self,id):
odb = OracleDB()
odb.connect_to_oracle ('dbname','dbuser','dbpassword')
username = odb.execute_sql_string ('select username from usertable where id= '+str(id))
odb.disconnect_from_oracle
return str(username[0][0])
# обычные статические переменные
variable1 = 'first variable'
variable2 = 'second variable'
# динамическая переменная с реализаей datapool
db = database()
Создадим тест, в котором используем нашу динамическую переменную
*** Settings ***
Variables var.py
*** Test Cases ***
test1
Log variables
Log ${db.get_username(2)}
Тут, мы в переменной указываем объект, метод и его свойство. Нам не надо писать лишнюю строку получения переменной.
Вывод в лог:
BuiltIn.Log Variables:
...skip...
16:16:58.945 INFO ${\n} =
16:16:58.945 INFO ${database} = var.database
16:16:58.945 INFO ${db} = var.database instance at 0x02CD8EB8>
...skip...
16:16:58.947 INFO ${variable1} = first variable
16:16:58.948 INFO ${variable2} = second variable
...skip...
BuiltIn.Log:
16:16:59.458 INFO myuser1
Вывод
Таком образом, мы получили возможность в одном variable файле описать как статические переменные, так и довольно сложные динамические конструкции.
Этот пример, как мне кажется, хорошо показывает продуманность и гибкость фреймворка Robot Framework. Особенно впечатляет использование “объектно ориентированности” в изначально функциональном DSL языке “робота”.