robotframework多行regexp

robotframework多行regexp,robotframework,Robotframework,早上好 我很抱歉,我被机器人框架困住了。 我目前正在尝试将JSON中的系统输出与预期输出进行比较 预期JSON输出,机器人框架格式: ${expected_output}= Catenate SEPARATOR=\n ... \ \ "id": "AAAAA-2017-07-21", ... \ \ "version": "2", ... \ \ "creationDateTime": "1500636720", ... \ \ "passengers"

早上好

我很抱歉,我被机器人框架困住了。 我目前正在尝试将JSON中的系统输出与预期输出进行比较

预期JSON输出,机器人框架格式:

${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)    ...  \ \ \ \ },
我完全迷路了,你能帮帮我吗

提前感谢,, 当做
Thomas

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

您没有说明要使用哪个库来获取JSON数据。该库很有可能能够将JSON数据转换为python对象。例如,请求库允许您将输出转换为类似于
${result.JSON()}
的python对象

一旦将JSON对象转换为真实对象,就可以使用robot的扩展变量语法直接寻址数据的任何部分

以下示例使用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}

注意:
字典应该是相等的
是从库中提供的

您注意到HTTPLibrary及其json功能了吗?非常感谢,非常有趣。非常感谢,我很快会测试它:)我可以问另一个与此相关的问题吗?实际上,在我的JSON结构中还有一个字段,其中包含执行测试的日期和时间。。。所以这意味着日期总是会改变。。。所以我这里有个问题。。。有没有一种方式可以说:除了提交日期之外,比较所有内容?谢谢你advance@Totoc1001:最简单的解决方案是在进行比较之前从实际值和预期值中删除日期。是的,但遗憾的是,这不是一个选项…:(我的意思是,我无法更改删除预期输出中的日期…你看到其他方法了吗?@Totoc1001:为什么你不能删除预期数据?是你创建了预期数据。