【问题标题】:How to match sub pattern in Robot Framework?如何匹配机器人框架中的子模式?
【发布时间】:2015-04-04 09:19:01
【问题描述】:

我在 RFW 做以下事情:

第 1 步:我需要匹配以下命令输出中的“NUM_FLOWS”值。

第 2 步:如果它的 "Zero - 0" ,测试用例应该失败。如果其非零,则测试用例通过。

示例命令输出:

router-7F2C13#show app stats gmail on TEST/switch1234-15E8CC
--------------------------------------------------------------------------------
     APPLICATION           BYTES_IN         BYTES_OUT           NUM_FLOWS
--------------------------------------------------------------------------------
  gmail                0                 0                  4
--------------------------------------------------------------------------------
router-7F2C13#

如何使用“应该匹配正则表达式”和“应该匹配”关键字来做到这一点?如何仅检查该数字子模式? (示例:在上述命令输出中,NUM_FLOWS 为非零,则测试用例应通过。)

请帮助我实现这一目标。

提前致谢。

我的新机器人文件内容:

    Write                   show dpi app stats BitTorrent_encrypted on AVC/ap7532-15E8CC
    ${raw_text}                 Read Until Regexp       .*# 
    ${data[0].num_flows}                    0
| | ${data}= | parse output | ${raw_text}
| | Should not be equal as integers | ${data[0].num_flows} | 0
| | ... | Excepted num_flows to be non-zero but it was zero | values=False

【问题讨论】:

  • 你尝试过什么?您在问题的哪一部分遇到困难?你知道如何写正则表达式吗?关键字文档不清楚吗?向我们展示您的研究有助于我们写出有用的答案。

标签: regex python-2.7 robotframework


【解决方案1】:

有很多方法可以解决这个问题。一种简单的方法是使用机器人的正则表达式关键字在行首查找“gmail”,然后期望三个数字,然后是数字 0(零),然后是行尾。这假设 a) NUM_FLOWS 始终是最后一列,并且 b) 只有一行以“gmail”开头。我不知道这些假设是否有效。

由于数据跨越多行,该模式包含(?m)multiline 标志),因此$ 表示“行尾”以及“字符串结尾”。

| | Should not match regexp | ${data} | (?m)\\s+gmail\\s+\\d+\\s+\\d+\\s+0\\s*$
| | ... | Expected non-zero value in the fourth column for gmail, but it was zero.

还有很多其他方法可以解决这个问题。例如,如果您需要检查其他列中的其他值,您可能需要编写一个 python 关键字来解析数据并返回某种数据结构。

这是一个简单的例子。它不是万无一失的,并且对传入的数据做出了一些假设。我不会在生产中使用它,但它说明了该技术。关键字返回一个项目列表,每个项目是一个自定义对象,有四个属性:name、bytes_in、bytes_our和num_flows:

# python library
import re

def parse_output(data):

    class Data(object): 
        def __init__(self, raw_text):
            columns = re.split(r'\s*', raw_text.strip())
            self.name = columns[0]
            self.bytes_in = int(columns[1])
            self.bytes_out = int(columns[2])
            self.num_flows = int(columns[3])

    lines = data.split("\n")
    result = []
    # skip first four lines and the last two
    for line in lines[4:-3]:
        result.append(Data(line))

    return result

在测试中使用它:

*** Test Cases ***
| | # <put your code here to get the data from the >
| | # <router and store it in ${raw_text}          >
| | ${raw_text}= | ...
| | ${data}= | parse output | ${raw_text}
| | Should not be equal as integers | ${data[0].num_flows} | 0
| | ... | Excepted num_flows to be non-zero but it was zero | values=False

【讨论】:

  • 非常感谢您的详细回答。我会试试这个。感谢您的帮助。
  • 请问,'${raw_text}' 是什么...?如果我使用它,我会收到“未找到变量'${raw_text}'”错误。它是一个内置变量吗?
  • @rcubefather:这是您从路由器获得的数据。这不是一个完整的测试。我会更新答案以澄清。
  • 我现在收到“解析变量 '${data[0].num_flows}' 失败:IndexError: index out of range: 0”错误。你能帮我解决这个问题吗? (由于我无法在 cmets 部分粘贴代码,因此我粘贴了有问题的机器人文件内容。请参见上文)
  • @rcubefather:显然parse output 没有返回任何数据。在这种情况下,它可能应该抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2023-03-04
  • 2018-03-13
  • 2018-04-25
  • 2020-01-22
相关资源
最近更新 更多