我会从不同的角度来处理你的问题。首先,我不建议使用 Groovy 的 XMLSlurper 或任何其他 XML 解析器从 Robot Framework 的 output.xml 中提取您需要的信息。
你应该使用的是Robot Framework 自己的 API,它已经实现了你需要的解析器。您可以轻松访问robots.result.model 模块中描述的任何信息。您可以在这里找到所有内容、套件、测试和关键字以及所有属性,例如测试消息、失败消息、执行时间、测试结果等。总而言之,这将是最适合未来的解析解决方案,因为该解析器将始终匹配框架的版本。确保使用与您当前框架版本相匹配的 API 文档。
现在回到你的任务,你应该通过 Robot Framework 的监听器接口使用上面提到的 API 。实现output_file
listener方法,您可以在 Robot Publisher 插件移动文件之前访问 output.xml(您甚至可以在此处复制它)文件。将output_file
在 output.xml 准备好后自动调用。该方法将获取 xml 文件的路径作为输入。您可以将此路径ExecutionResult
从 API 直接传递给类,然后您可以“访问”您的结果ResultVisitor
并获取所需的信息。
最后一步是将数据写入一个文件,作为电子邮件阶段的输入。请注意,默认情况下,Robot Publisher 不会触及此文件,因为它不是标准输出,而是您刚刚使用 Robot Framework 的 API 进行的自定义。
因为它可能听起来很多,这里有一个例子来展示这个想法。EmailInputProvider.py 中的监听器和结果访问者:
from robot.api import ExecutionResult, ResultVisitor
class MyTestResultVisitor(ResultVisitor):
def __init__(self):
self.test_results = dict()
def visit_test(self, test):
self.test_results[test.longname] = test.status
class EmailInputProvider:
ROBOT_LISTENER_API_VERSION = 3
def output_file(self, path):
output = 'EmailInput.txt'
visitor = MyTestResultVisitor() # Instantiate result visitor
result = ExecutionResult(path) # Parse up execution result using robot API
result.visit(visitor) # Visit and top level suite to retrive needed metadata
with open(output, 'w') as f: # Write retrived data into a file
for testname, result in visitor.test_results.items():
print(f'{testname} - {result}', file=f)
# You can make a copy of the output.xml here as well
print(f'Email: Input saved into {output}') # Log about custom output to console
globals()[__name__] = EmailInputProvider
这将为这个虚拟套件(SO2.robot)提供以下结果:
*** Test Cases ***
Test A
No Operation
Test B
No Operation
Test C
No Operation
Test D
No Operation
Test E
No Operation
Test F
Fail
控制台输出:
$ robot --listener EmailInputProvider SO2.robot
==============================================================================
SO2
==============================================================================
Test A | PASS |
------------------------------------------------------------------------------
Test B | PASS |
------------------------------------------------------------------------------
Test C | PASS |
------------------------------------------------------------------------------
Test D | PASS |
------------------------------------------------------------------------------
Test E | PASS |
------------------------------------------------------------------------------
Test F | FAIL |
AssertionError
------------------------------------------------------------------------------
SO2 | FAIL |
6 critical tests, 5 passed, 1 failed
6 tests total, 5 passed, 1 failed
==============================================================================
Email: Input saved into EmailInput.txt
Output: ..\output.xml
Log: ..\log.html
Report: ..\report.html
自定义输出文件:
SO2.Test A - PASS
SO2.Test B - PASS
SO2.Test C - PASS
SO2.Test D - PASS
SO2.Test E - PASS
SO2.Test F - FAIL