机器人框架多线正则表达式

时间:2017-08-01 10:02:13

标签: robotframework

早上好,

我很抱歉,但我坚持使用RobotFramework。 我目前正在尝试将JSON中的系统输出与我预期的输出进行比较。

预期的JSON输出,采用Robot Framework格式:

${expected_output}=  Catenate  SEPARATOR=\n
   ...  \ \ "id": "AAAAA-2017-07-21",
    ...  \ \ "version": "2",
    ...  \ \ "creationDateTime": "1500636720",
    ...  \ \ "passengers": {
    ...  \ \ \ \ "1": {
    ...  \ \ \ \ \ \ "names": [{
    ...  \ \ \ \ \ \ \ \ "firstName": "TOTO",
    ...  \ \ \ \ \ \ \ \ "lastName": "TUTU"
    ...  \ \ \ \ \ \ }],
    ...  \ \ \ \ },
    ...  \ \ \ \ "2": {
    ...  \ \ \ \ \ \ "id": "1",
    ...  \ \ \ \ \ \ "names": [{
    ...  \ \ \ \ \ \ \ \ "firstName": "TATA",
    ...  \ \ \ \ \ \ \ \ "lastName": "TUTU"
    ...  \ \ \ \ \ \ }],
    ...  \ \ \ \ }
    ...  \ \ },

执行以下操作非常有效,

Should Be Equal As Integers    ${output.rc}    0
Should Be Equal As Strings  ${output.stdout}  ${expected_output}
Should Match Regexp ${output.stdout}  "(names|1)"

但我的观点是,我希望能够解析多行,例如,我想只比较第一个乘客信息,我真的不关心其余的输出消息。

...  \ \ \ \ "1": {
...  \ \ \ \ \ \ "names": [{
...  \ \ \ \ \ \ \ \ "firstName": "TOTO",
...  \ \ \ \ \ \ \ \ "lastName": "TUTU"
...  \ \ \ \ \ \ }],
...  \ \ \ \ },

我只想确保在我的整个邮件中,上面的行是正确的,而不是检查我的邮件的重新映射。

我真的不知道该怎么做,我已经看到我可以使用(?m)进行多行检查, 但我不知道如何使用它,它根本不起作用:(

应该是这样的:

Should Match Regexp (?m)    ...  \ \ \ \ "1": {
(?m)    ...  \ \ \ \ \ \ "names": [{
(?m)    ...  \ \ \ \ \ \ \ \ "firstName": "TOTO",
(?m)    ...  \ \ \ \ \ \ \ \ "lastName": "TUTU"
(?m)    ...  \ \ \ \ \ \ }],
(?m)    ...  \ \ \ \ },

我完全迷了,你能帮助我吗?

提前致谢, 问候。 托马斯

1 个答案:

答案 0 :(得分:1)

如果要获取结构化数据,正则表达式是该作业的错误工具。

您没有说您正在使用哪个库来获取JSON数据。库很有可能将JSON数据转换为python对象。例如,请求库允许您使用${result.json()}之类的内容将输出转换为python对象。

将JSON对象转换为真实对象后,可以使用机器人的扩展变量语法直接处理数据的任何部分。

以下示例使用python的json解码器将实际值转换为对象,然后验证第一位乘客的名字:

${actual}=  evaluate  json.loads('''${output.stdout}''')  json
Should be equal  ${actual["passengers"]["1"]["names"][0]["firstName"]}  TOTO

您可以使用相同的技术来比较整个字典,方法是将您的预期值设置为您想要比较的值

${expected}=  Catenate
...  {
...    "names": [{
...        "firstName": "TOTO",
...        "lastName": "TUTU"
...    }]
...  }
${expected}=  evaluate  json.loads('''${expected}''')  json
${actual}=  evaluate  json.loads('''${output.stdout}''')  json

Dictionaries should be equal  ${actual["passengers"]["1"]}  ${expected}

注意:Dictionaries should be equal来自Collections