Как передать в командной строке переменную Robot Framework из командной строки - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь запустить main () из моего теста python из моего RF-файла с необязательным диапазоном аргументов ключевого слова, доменом и временем ожидания.Тест работает нормально, если я жестко закодировал аргументы в RF-файле, но я надеюсь, что смогу установить их из командной строки.Я надеюсь, что смогу запустить файл RF, выдав любой, все или ни один из 3 аргументов, перечисленных выше, с чем-то похожим на robot -v dict_args:range=5_domain=4 -E space=_ run_test.robot.Согласно документации, «с помощью этого синтаксиса можно задавать только скалярные переменные, и они могут получать только строковые значения», но я видел здесь людей, которые могут написать обходной путь для списков ( Как передать списокв качестве аргумента командной строки в каркасе робота .?).Если бы не удалось найти что-либо о диктантах, любой совет / помощь будет принята с благодарностью.

run_test.robot:

*** Settings ***

Library    my_test
Library    Process

*** Test Cases ***
Run RNTester
    Run Program    ${dict-args}


*** Keywords ***
Run Program
    [Arguments]    &{configuration}
    main    &{configuration}

my_test.py:

def main(**kwargs):
    #process args
    if 'range' in kwargs:
        range_ = kwargs['range'].split(':')
        range_ = list(map(int,range_))
        if len(range_) == 1:
            range_.insert(0,0)
        test_count = range_[1] - range_[0]
    else:
        range_ = None
        test_count = 0

    if 'domain' in kwargs:
        domain = kwargs['domain'].split(',')
    else:
        domain = None

    if 'timeout' in kwargs:
        timeout = int(kwargs['timeout'])
    else:
        timeout = 30

    run_test(domain, range_, test_count, timeout)

FIXED Отредактировал мой код для записи в файл yaml как @Джил предложил.Добавлен YAMLCreator.py для создания файла yaml, который импортирует мой RF-файл.Вот что у меня сейчас есть

run_test.robot:

*** Settings ***

Library    my_test
Variables    ${testname}.yaml

*** Test Cases ***

Run RNTester
    Run Program    &{test_name}


*** Keywords ***
Run Program
    [Arguments]    &{configuration}
    main    &{configuration}

YAMLCreator.py:

import yaml
import sys

def make_dict(**kwargs):

    data = dict()
    for key in kwargs:
        value = kwargs[key]
        data[key] = value
    return data

if __name__ == '__main__':

    args = sys.argv
    test_name = args[1]
    data = make_dict(**dict(arg.split('=') for arg in args[2:]))

    test_name_dict=dict()
    test_name_dict[test_name] = data

    with open(test_name + '.yaml', 'w') as outfile:
        yaml.dump(test_name_dict, outfile, default_flow_style=False)

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Словари нельзя передать из командной строки.Лучший способ импортировать структуры Python - это использовать YAML.Это позволит вам загружать их непосредственно как переменные в Robot.

Загрузка файла YAML может быть выполнена тремя способами:

  1. Из командной строки с использованием --variablefile FileName.yaml
  2. В Раздел настроек как Variable FileName.yaml
  3. Использование Ключевое слово : Import Variables FileName.yaml

Все три подхода имеют свои плюсы и минусы.Если у вас есть фиксированный набор данных, который вы должны импортировать, то подход 2 будет в порядке.Если вы знаете, какой набор данных вы должны использовать при запуске Robot Framework, я бы выбрал номер 1. Если это решение может быть принято только во время выполнения теста, выберите вариант 3.

0 голосов
/ 05 июня 2018

Расширение примера кода, который вы связали, можно сделать так:

*** Settings ***
Library    String

*** Keywords ***
Convert String To Dictionary
    [Arguments]    ${my_dict_string}
    @{list_of_items}    Split String    ${my_dict_string}
    ${my_dict} =  Create Dictionary  @{list_of_items}
    [Return]  ${my_dict}

Но лично я нахожу такой способ передачи переменной dict довольно безобразно.Если о файле переменной не может быть и речи, я бы, вероятно, вместо этого использовал бы json и eval:

*** Keywords ***
Convert JSON to Dictionary
    [Arguments]  ${json_string}
    ${d}=  evaluate  json.loads('''${json_string}''')  json
    [Return]  ${d}

, а затем назвал бы его так:

robot -v 'dict_args:{"range":5, "domain":4}' run_test.robot
...