Почему у меня нет измененного словаря в Robot, даже если ключевое слово Python изменило словарь? - PullRequest
1 голос
/ 13 января 2020

Вот мой файл робота (robot-dictionary-tests.robot)

*** Settings ***
Documentation  Passing a dictionary object from Robot to Python and vice versa
Library        Utils.py

# To run:
# robot -L debug -d Results/  Tests/robot-dictionary-tests.robot


*** Keywords ***
Call Python To Modify The Dictionary
[arguments]  &{named}
modify dictionary   ${named}

*** Test Cases ***
Test Modifying Robot Dictionary in Python
    &{d} =          Create Dictionary       key=original
    &{expected} =   Create Dictionary       key=modified
    Call Python To Modify The Dictionary    &{d}
    Should Be Equal   ${d}      ${expected}

Вот мой Utils.py:

from robot.api import logger

@keyword('modify dictionary')
def modify_dictionary(d):
   logger.debug(f'before modification, d: {d}')
   for key in d:
       d[key] = 'modified'
   logger.debug(f'after modification, d: {d}')

The Test Case Test Modification Словарь роботов в Python не работает: enter image description here

Мой вопрос

Почему тест робота не проходит, даже если я передал в словаре d ссылку на @ ключевое слово («изменить словарь»)?

1 Ответ

4 голосов
/ 13 января 2020

Как вы и подозревали, переменные приведены по ссылке и, следовательно, изменены. Насколько мне известно, это больше связано с Python, чем с Robot Framework.

Передача словаря как объекта должна осуществляться через $ {VarName}, а не & {VarName}. Документация по словарным переменным объясняет это следующим образом:

... a Python словарь или похожий на словарь объект можно использовать в качестве словарной переменной, например & {EXAMPLE} , На практике это означает, что отдельные элементы словаря передаются в качестве именованных аргументов ключевому слову

. В приведенном ниже коде для ключевого слова Call Python To Modify The Dictionary я изменяю аргумент ключевого слова &{named} на ${named} и где ключевое слово называется &{d} до ${d}.

*** Keywords ***
Call Python To Modify The Dictionary
    [arguments]  ${named}
    modify dictionary   ${named}

*** Test Cases ***
Test Modifying Robot Dictionary in Python
    &{d} =          Create Dictionary       key=original
    &{expected} =   Create Dictionary       key=modified
    Call Python To Modify The Dictionary    ${d}
    Should Be Equal   ${d}      ${expected}

В результате:

Suite Executor: Robot Framework 3.1.2 (Python 3.7.0 on win32)
==============================================================================
SO003                                                                         
==============================================================================
SO003.Test :: Passing a dictionary object from Robot to Python and vice versa 
==============================================================================
Test Modifying Robot Dictionary in Python                             | PASS |
------------------------------------------------------------------------------
SO003.Test :: Passing a dictionary object from Robot to Python and... | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
SO003                                                                 | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...