繁体   English   中英

解析机器人框架的输出xml

[英]Parse Robot Framework's output xml

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

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

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

好的,找到3个可行的回复:

  1. 使用DbBot并查询创建的数据库。
  2. 直接解析XML文件。 使用xml.etree.ElementTree非常简单。
  3. 使用Robot Framework的ExecutionResult ,它遵循Visitor模式(在ResultVisitor中 ,我们必须扩展),并允许您在visit_test方法中执行您需要的visit_test

最后选择3作为Robot Framework的一部分,如果XML文件的格式发生变化,则不太可能破坏(或更容易修复)。

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

当写入输出文件准备就绪时,将调用Listener版本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

附加日志文件列在默认输出中。

这个答案借鉴了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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM