机器人框架吐出一个输出XML,然后将其用于构建HTML报告(带有rebot
),重新运行失败等。
我需要解析此文件以生成其他报告,特别是,我需要解析正则表达式的测试用例文档,获取测试用例结果,然后生成报告(用于与旧式系统集成)。
Robot Framework是否提供了轻松解析输出XML文件的功能,还是我们仅使用标准XML解析库?
答案 0 :(得分:5)
好,发现了3个可行的答案:
DbBot
并查询创建的数据库。xml.etree.ElementTree
非常简单。最后选择了选项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)