[Заметка] Datapool через variablefile в RobotFramework

Проблема

Зачастую тестировщики используют в тестах статические переменные, реже – списки и словари.

Однако, рано или поздно возникает ситуация, когда в тесте необходимо получить переменную, значение которой вычисляется динамически.

Это может быть 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 языке “робота”.

3 лайка

Стоит еще упомянуть ссылку на документацию в Robot Framework по этому поводу http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html#advanced-variable-features