2016-12-03 7 views
1

У меня есть ключевое слово в рамке робота; Он принимает аргумент, выполняет некоторый процесс на него и возвращает его после того, как все:Как передать аргументы по ссылке на ключевые слова для робота?

My Keyword Name 
    [Arguments] ${arg} 
    # Some process on ${arg} 
    [Return]  ${arg} 

Так было бы использование:

${x} = My Keyword Name ${x} 

Что означает, что я дал старое значение ${x} к ключевому слову и он вернул мне новое значение.

Я хочу позвонить по телефону My Keyword Name, поэтому мне не нужно использовать назначение для установки нового значения для ${x}. Я прочитал BuiltIn и UserGuide, , но не было линии по этому вопросу. Может ли кто-нибудь помочь мне в этом?

ответ

3

Если ${x} является изменяемым типом, таким как список или словарь, вы можете передать сам объект. Если он представляет скалярное значение, такое как строка или int, вы не можете делать то, что хотите. Ваш единственный выбор - вернуть новое значение и повторно назначить его исходной переменной.

+0

Я думаю, что вы правы. Я много исследовал и ничего не нашел. –

+0

@ZeinabAbbasimazar Переменные типы Python на самом деле изменяемы по ключевым словам - проверьте мой ответ ниже. – Todor

0

Это будет работать, если вы инициализировать переменную как

My Keyword Name 
    [Arguments] ${arg} 
    ${arg} = Set Variable 56 
    [Return]  ${arg} 

Test 
    Log To Console \n\nin Test 
    ${x} = Set Variable 0 
    ${x} = My Keyword Name ${x} 
    Log To Console ${x} 

Или

Вы можете исследовать, можно ли сделать использование Набор глобальных переменных или Set Test Variable?

+0

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

-1

Welp Я просто столкнулся с той же проблемой, что и при использовании инструкции Run Keyword If в Loop. Зная, что если бы я использовал ключевое слово, которое возвращает значение, робот-фреймворк отключается.

Так что я просто подумал об этом как о потенциальном решении. Он будет использовать мой пример. У этого есть избыточность, но это потому, что вам просто нужно в этом случае.

***Keywords*** 
| Increment | [Arguments] | ${var} | 
| | ${var} | Evaluate | ${var} + 1 | 
| | Set Test Variable | ${var} | ${var} | 

Использование:

| Increment | ${idx} | 
| Set Test Variable | ${idx} | ${var} 

Сейчас я не говорю, что это лучшее решение, но при запуске в сценарий, который вы должны возвращать значение переменной с ключевым словом, и вы находитесь внутри «Run Keyword If», это должно позволить вам обойти проблему. Мне это не очень нравится, но он выполняет свою работу.

0

Я провел некоторое время, прежде чем я получил решение!

* Variables 
${someVar} initial value 

* Test Cases 
[Check reference] 
    Set this   \${someVar} new value 
    Should Be Equal ${someVar} new value 

* Keywords 
Set this 
[Arguments]   ${varName} ${value} 
Set Test Variable ${varName} ${value} 

Дело в магии «\» символ :)

1

Это на самом деле сводится к изменяемых/неизменяемых переменных в Python, и как они передаются функции.

Подробности здесь in this answer, но в контексте РФ это сводится к - вы можете изменять списки и словари, а не строки и числа (int, float).Пример:

A testcase 
    Log To Console  \n 
    ${var}=  Create List member1 
    Log To Console  ${var} 

    Mutate The List  ${var} 
    Log To Console  ${var} 

*** Keywords *** 
Mutate The List 
    [Arguments]  ${lst} 
    Append To List  ${lst} new one 

Выходной сигнал, когда побежал бы:

============================================================================== 
A testcase                

['member1'] 
['member1', 'new one'] 
| PASS | 

, например, переменная, определенная в случае, была изменена ключевым словом. То же самое можно сделать со словарями.

Если вы переназначите переменную в функции, она не изменится; например с ключевым словом, как это:

Mutate The Dict 
    [Arguments]  ${lst} 
    ${lst}=  Create List fsf 
    Append To List  ${lst} bogus 

, исходная переменная ${var} не будет изменен.
Почему так? Короче говоря, в переменных python есть только идентификаторы («имена») на адреса памяти; когда вы назначаете ${lst} в новый список, переменная теперь указывает на новый адрес в памяти, а дальнейшие взаимодействия не меняют исходный.

Смежные вопросы