user7656533
user7656533

Reputation:

Dictionary as variable in Robot Framework: code runs ok but the IDE yields error

I'm trying to set up a dictionary as a variable (so I can use it as a Resource and access its values from another file) and there is something that is driving me crazy.

Here is the code I have (just for testing purposes):

*** Settings ***
Documentation    Suite description
Library  Collections

*** Variables ***
&{SOME DICT}  key1=value1  key2=value2

*** Test Cases ***
Dict Test                                # why $ instead of &?
    ${RANDOM VAR}=  Get From Dictionary  ${SOME DICT}  key1
    Log  ${RANDOM VAR}  WARN

If I run that, I got the expected result ([ WARN ] value1) BUT the IDE (PyCharm) is complaining about that ${SOME DICT} variable is not defined, and the dictionary declaration is not highlighted the same as variable or a list.

If I change that to &{SOME DICT} the IDE won't complain anymore, but the test fails with the following output:

Dict Test                                                             | FAIL |
Keyword 'Collections.Get From Dictionary' got positional argument after named arguments.

That is puzzling me to no end: why I have to use a $ instead of a & if it's a dictionary to make it work? Is there something I am doing wrong and it is just running by luck?

Thanks for any advice or guidance you may have!

Upvotes: 5

Views: 23699

Answers (2)

Milan Paliwal
Milan Paliwal

Reputation: 72

Simple Example to Use Key Value Variable in robot framework Set value to dictionary Get value from dictionary

&{initValues} Create Dictionary key1=value1 key2=value2

Set To Dictionary ${initValues} key1=newvalue1

Set To Dictionary ${initValues} key2=newvalue2

Set To Dictionary ${initValues} key3=newvalue3

${value} Get From Dictionary ${intialValues} key1

Upvotes: 0

jozefow
jozefow

Reputation: 786

Have a look into "Get from Dictionary" libdoc,looks like example is showing the same as your working snippet:

Name: Get From Dictionary
Source: Library (Collections)
Arguments: [dictionary, key]

Returns a value from the given ``dictionary`` based on the given ``key``.

If the given ``key`` cannot be found from the ``dictionary``, this
keyword fails.

The given dictionary is never altered by this keyword.

Example:
| ${value} = | Get From Dictionary | ${D3} | b |
=>
| ${value} = 2

Keyword implementation details are as follows:

try:
            return dictionary[key]
        except KeyError:
            raise RuntimeError("Dictionary does not contain key '%s'." % key)

So indeed, Robot sends representation of dict content and not dict name thus value for key can be returned. This is the same as direct call in python:

a = {u'key1': u'value1', u'key2': u'value2'}
print(a['key1'])

In the end, libdoc for that KW is not straightforward but your PyCharm plugin for Robot does not work properly in this case. In RED Robot Editor (Eclipse based), proper case does not rise any warnings in editor, wrong-case provides error marker about arguments (better but still not clear what is exactly wrong. Blame minimalistic libdoc info).

ps. I am lead of RED project to be clear.

Upvotes: 2

Related Questions