解析机器人框架的输出xml

时间:2019-01-11 18:57:56

标签: python robotframework

机器人框架吐出一个输出XML,然后将其用于构建HTML报告(带有rebot),重新运行失败等。

我需要解析此文件以生成其他报告,特别是,我需要解析正则表达式的测试用例文档,获取测试用例结果,然后生成报告(用于与旧式系统集成)。

Robot Framework是否提供了轻松解析输出XML文件的功能,还是我们仅使用标准XML解析库?

3 个答案:

答案 0 :(得分:5)

好,发现了3个可行的答案:

  1. 使用DbBot并查询创建的数据库。
  2. 直接解析XML文件。使用xml.etree.ElementTree非常简单。
  3. 使用Robot Framework的ExecutionResult,它遵循 Visitor 模式(在ResultVisitor中,我们必须对其进行扩展),并且可以让您在{ {1}}方法。

最后选择了选项3,因为它是Robot Framework的一部分,并且如果XML文件的格式发生更改,则不太可能损坏(或更容易修复)。

答案 1 :(得分:4)

我遇到了与您类似的问题,对我来说,使用Robot Framework的Listener Interface是最方便的解决方案。

准备好写入输出文件时,将调用Listener version 3 API中的output_file方法。该方法的参数是输出XML文件的绝对路径,这是创建任何类型的新报告所必需的。

示例:

import os

"""Listener that parses the output XML when it is ready and creates a unique log."""

ROBOT_LISTENER_API_VERSION = 3

def output_file(path):
    # parse xml with etree or lxml
    log_dir = os.path.split(path)[0]
    print('Extra log: %s' % (log_dir + '\\extra.log'))

测试执行的控制台日志:

D:\robot_framework>robot --listener my_listener.py my_test.robot
==============================================================================
My Test
==============================================================================
Some Test                                                             | PASS |
------------------------------------------------------------------------------
My Test                                                               | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Extra log: D:\robot_framework\extra.log
Output:  D:\robot_framework\output.xml
Log:     D:\robot_framework\log.html
Report:  D:\robot_framework\report.html

其他日志文件在默认输出中列出。

答案 2 :(得分:1)

此答案借鉴了Bence的示例,但增加了回显总计摘要行的功能。

#!/usr/bin/env python3

# invoke with robot --listener API-Libs/RF_Listener.py

import xml.etree.ElementTree as xmlElementTree

ROBOT_LISTENER_API_VERSION = 3

class RF_Listener:  # class should be same as filename

    def __init__(self):
        self.ROBOT_LISTENER_API_VERSION = 3

    def output_file(self, path):  # Listener that parses the output XML when it is ready
      root = xmlElementTree.parse(path).getroot()
      for type_tag in root.findall('./statistics/total/stat'):
      # <stat pass="1" fail="2">Critical Tests</stat>
      # <stat pass="3" fail="4">All Tests</stat>
        cntPassed = int(type_tag.attrib.get("pass"))  # attrib is dict-like (except for 'text')
        cntFailed = int(type_tag.attrib.get("fail"))
        cntTests = cntPassed + cntFailed
        pct_pass = cntPassed / cntTests * 100
        fmt_str = "{}: {} tests, {} passed, {} failed, {:.3g}% pass rate (--listener summary)"
        print(fmt_str.format(type_tag.text,cntTests, cntPassed, cntFailed,pct_pass))
      # optionally write grand total results summary to a file

此版本打印到STDOUT而不是写入文件,因此在输出末尾插入这两行。适用于grep(特别是在Jenkins工作description-setter插件中使用。)

Critical Tests: 3 tests, 1 passed, 2 failed, 33.3% pass rate (--listener summary)
All Tests: 7 tests, 3 passed, 4 failed, 42.9% pass rate (--listener summary)