Я буду go впереди и последую в ответе, так как это проще, я думаю, что ответит на ваш дополнительный вопрос в этом комментарии .
Я не очень знаком с Robot Framework, но если я правильно понимаю все, что он делает в .robot
файлах, когда вы используете ${variable}
, подстановка представляет собой простой шаблон строки: поэтому, когда вы передаете ${variable}
в выражение, независимо от того, какой тип лежит в основе переменной то есть, он всегда заменяет свое строковое представление, поэтому выражение, которое вы пытаетесь вычислить, буквально:
json.loads({'key': "value1', 'key2': 'value2'})
Вот почему вам нужен """
(в принципе вы можете использовать только "
, но """
было бы намного безопаснее). Между прочим, если вы преобразовали вышеуказанный dict в стандартное строковое представление в Python, то не будет действительным JSON, потому что JSON требует двойных кавычек, а не одинарных. * Официальная документация немного сбивает с толку и, кажется, противоречит самой себе (я думаю, что она не была написана носителем английского языка Engli sh, что в порядке):
Когда переменная используется в выражении с использованием обычного синтаксиса ${variable}
, ее значение заменяется перед вычислением выражения. Это означает, что значение, используемое в выражении, будет строковым представлением значения переменной, а не самого значения переменной. Это не проблема с числами и другими объектами, которые имеют строковое представление, которое может быть оценено непосредственно, но с другими объектами поведение зависит от строкового представления.
Я говорю, что это противоречит само себе, потому что первый говорит "его значение [заменяется] до того, как выражение будет оценено". Но тогда он говорит, что «значение, используемое в выражении, будет строковым представлением значения переменной» (которое не совпадает с самим значением). Последнее объяснение кажется правильным, однако.
Однако, похоже, с Evaluate
вы также можете использовать синтаксис $variable
для замены буквального значения переменной вместо ее строкового представления:
Начиная с Robot Framework 2.9, сами переменные автоматически доступны в пространстве имен оценки. Доступ к ним можно получить с помощью специального синтаксиса переменных без фигурных скобок, таких как $variable
. Эти переменные никогда не должны заключаться в кавычки, и на самом деле они даже не заменяются внутри строк.
Но в вашем случае вы написали:
${json_string} Set Variable {"key1": "value1", "key2": "value2", "key3": "value3"}
Как я понимаю "Установить переменную msgstr "просто сохраняет значение как строковый литерал. Так что, на самом деле, этого должно быть достаточно для запуска (как вы сделали):
${dict} Evaluate json.loads('''${json_string}''') json
В вашем последнем примере «Преобразовать в строку» ничего не делает, потому что, как вы написали, ${json_string}
уже заменяет собой строку. Вам просто нужно понять, что результатом json.loads(${json_string}
) является выражение Python, где ${json_string}
просто заменяется содержимым этой переменной шаблона - это не то же самое, что передача значения str
в json.loads()
. Последнее, я полагаю, может быть достигнуто, по крайней мере,
${dict} Evaluate json.loads($json_string) json
, проходя мимо документов. Но я не проверял это.