web-dev-qa-db-fra.com

Manipulation de Json dans ROBOT

J'ai un fichier Json, dans lequel il y a un champ dont j'ai besoin pour modifier et enregistrer le fichier pour la prochaine utilisation.

Mais le champ que je dois modifier est comme indiqué ci-dessous,

La valeur dont j'ai besoin pour évaluer le champ est générée aléatoirement au moment de l'exécution que je vais capturer dans une variable et la transmettre à cette clé spécifique json "dp" puis enregistrer le json.

Le json enregistré sera utilisé pour REST POST url.

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

S'il vous plaît, aidez-moi, j'utilise le cadre ROBOT, j'ai besoin de mettre à jour le champ json en cours d'exécution.

13
Vidya S

La solution la plus simple serait d'écrire un mot clé python qui peut changer la valeur pour vous. Cependant, vous pouvez résoudre ce problème avec des mots clés de robot en effectuant les étapes suivantes:

  1. convertir la chaîne JSON en dictionnaire
  2. modifier le dictionnaire
  3. reconvertir le dictionnaire en chaîne JSON

Convertir la chaîne JSON en dictionnaire

Python possède un module ( json ) pour travailler avec les données JSON. Vous pouvez utiliser le mot clé évaluer pour convertir votre chaîne JSON en un dictionnaire python) à l'aide de la méthode charges (chaîne de chargement) de ce module.

En supposant que vos données JSON se trouvent dans une variable de robot nommée ${json_string}, vous pouvez le convertir en un dictionnaire python comme celui-ci:

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

Avec ce qui précède, ${json} contient maintenant une référence à un dictionnaire qui contient toutes les données json.

Modifier le dictionnaire

La bibliothèque Collections fournie avec le robot a un mot-clé nommé défini sur dictionnaire qui peut être utilisé pour définir la valeur d'un élément de dictionnaire. Dans ce cas, vous devez modifier la valeur d'un dictionnaire imbriqué dans l'élément vt de l'objet JSON. Nous pouvons référencer ce dictionnaire imbriqué en utilisant le robot syntaxe variable étendue .

Par exemple:

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

Avec ça, ${json} a maintenant la nouvelle valeur. Cependant, il s'agit toujours d'un dictionnaire python plutôt que de données JSON, il y a donc une étape de plus.

Reconvertissez le dictionnaire en json

La reconversion du dictionnaire en JSON est l'inverse de la première étape. À savoir, utilisez la méthode dumps (dump string) du module json:

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

Avec ça, ${json_string} contiendra une chaîne JSON valide avec les données modifiées.


Exemple complet

Voici un exemple de travail complet. La chaîne json sera imprimée avant et après la substitution de la nouvelle valeur:

*** 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}
24
Bryan Oakley

Pour lire et écrire des données vers et depuis un fichier, j'utilise la bibliothèque OperatingSystem

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

Cela fonctionne pour moi sur les tests API, pour lire .json et POST, comme ici

*** 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
2
idomoni