如何在Robot Framework中匹配子模式?

时间:2015-02-04 18:10:05

标签: regex python-2.7 robotframework

我在做RFW中的事情:

第1步:我需要匹配" NUM_FLOWS"来自以下命令输出的值。

步骤2:如果它的"零 - 0" ,测试用例应该失败。如果它的NON-ZERO,测试用例是通行证。

示例命令输出:

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

如何使用"匹配Regexp"和#34;应匹配"关键字?如何只检查那个数字子模式? (例如:在上面的命令输出中,NUM_FLOWS是NON-ZERO,那么testcase应该是PASS。)

请帮助我实现这一目标。

提前致谢。

我的新机器人文件内容:

    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

1 个答案:

答案 0 :(得分:1)

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

由于数据跨越多行,因此模式包含(?m)multiline标志),因此除了“字符串结尾”之外,$表示“行尾”。 / p>

| | 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