Подтвердить что ты не робот

Обработка Json в ROBOT

У меня есть Json файл, в котором есть поле, которое мне нужно отредактировать и сохранить файл для следующего использования.

Но поле, которое мне нужно изменить, показано ниже,

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

Сохраненный json будет использоваться для URL REST POST.

            {
                "p": "10",
                "v": 100,
                "vt": [
                    {
                        "dp": "Field to be edited"(integer value) , 
                  ]          
            }

Пожалуйста, помогите мне, я использую структуру ROBOT, мне нужно обновить поле json во время выполнения.

4b9b3361

Ответ 1

Самым простым решением было бы написать ключевое слово python, которое может изменить значение для вас. Однако это можно решить с помощью ключевых слов робота, выполнив следующие действия:

  1. преобразовать строку JSON в словарь
  2. изменить словарь
  3. преобразовать словарь обратно в строку JSON

Преобразовать строку JSON в словарь

В Python есть модуль (json) для работы с данными JSON. Вы можете использовать ключевое слово > для преобразования строки JSON в словарь Python, используя метод load (строка загрузки) этого модуля.

Предполагая, что ваши данные JSON находятся в переменной робота с именем ${json_string}, вы можете преобразовать их в словарь Python следующим образом:

${json}=    evaluate    json.loads('''${json_string}''')    json

С учетом вышесказанного, ${json} теперь содержит ссылку на словарь, который содержит все данные json.

Изменить словарь

В библиотеке Collections, которая поставляется с роботом, есть ключевое слово с именем , установленное в словарь, которое можно использовать для установки значения элемента словаря. В этом случае вам нужно изменить значение словаря, вложенного в элемент vt объекта JSON. Мы можем ссылаться на этот вложенный словарь, используя расширенный синтаксис робота extended variable syntax.

Например:

set to dictionary    ${json["vt"]}    dp=the new value

С этим у ${json} теперь есть новое значение. Однако это все еще словарь Python, а не данные JSON, так что есть еще один шаг.

Преобразовать словарь обратно в json

Преобразование словаря обратно в JSON - это обратная сторона первого шага. А именно, используйте метод dumps (строка дампа) модуля json:

${json_string}=    evaluate    json.dumps(${json})    json

При этом ${json_string} будет содержать допустимую строку JSON с измененными данными.


Полный пример

Ниже приведен полный рабочий пример. Строка json будет напечатана до и после замены нового значения:

*** Settings ***
Library    Collections

*** Test Cases ***
Example
    ${json_string}=    catenate
    ...  {
    ...    "p": "10",
    ...    "v": 100,
    ...    "vt": {
    ...            "dp": "Field to be edited"
    ...          }
    ...  }

    log to console       \nOriginal JSON:\n${json_string}
    ${json}=             evaluate        json.loads('''${json_string}''')    json
    set to dictionary    ${json["vt"]}    dp=the new value
    ${json_string}=      evaluate        json.dumps(${json})                 json
    log to console       \nNew JSON string:\n${json_string}

Ответ 2

Для чтения и записи данных в файл и из файла я использую библиотеку OperatingSystem

${json} Get Binary File ${json_path}nameOfJsonFile.json

Это работает для меня на тестирование API, чтобы прочитать .json и POST, как здесь

*** Settings ***
Library    Collections
Library    ExtendedRequestsLibrary 
Library    OperatingSystem
*** Variables ***  
${uri}    https://blabla.com/service/
${json_path}    C:/home/user/project/src/json/
*** Test Cases ***
Robot Test Case  
   Create Session    alias    ${uri}    
   &{headers}  Create Dictionary  Content-Type=application/json; charset=utf-8
   ${json}  Get Binary File  ${json_path}nameOfJsonFile.json
   ${resp}    Post Request    alias    data=${json}    headers=${headers}
   Should Be Equal As Strings    ${resp.status_code}    200