0

我正在为运行机器人框架测试的 Jenkins 管道创建一个 Groovy 电子邮件模板。我打算使用 Groovy 的 XMLSlurper 来解析 Jenkins 创建的 output.xml 以提取我需要的信息。但是,该模板还依赖于使用 Robot Publisher,我现在意识到它会自动删除 output.xml。我宁愿不必存档工件并以这种方式访问​​它们,所以有没有办法在机器人发布者阶段之前在詹金斯管道中创建 output.xml 的副本,机器人发布者不会删除它,我可以在我的电子邮件阶段解析吗?

请多多包涵,因为我对 Jenkins(以及 stackoverflow 而言)相对较新,所以如果我排除了重要信息,我们深表歉意,但任何想法都会非常感激!谢谢

4

1 回答 1

0

我会从不同的角度来处理你的问题。首先,我不建议使用 Groovy 的 XMLSlurper 或任何其他 XML 解析器从 Robot Framework 的 output.xml 中提取您需要的信息。

你应该使用的是Robot Framework 自己的 API,它已经实现了你需要的解析器。您可以轻松访问robots.result.model 模块中描述的任何信息。您可以在这里找到所有内容、套件、测试和关键字以及所有属性,例如测试消息、失败消息、执行时间、测试结果等。总而言之,这将是最适合未来的解析解决方案,因为该解析器将始终匹配框架的版本。确保使用与您当前框架版本相匹配的 API 文档。

现在回到你的任务,你应该通过 Robot Framework 的监听器接口使用上面提到的 API 。实现output_filelistener方法,您可以在 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
于 2020-09-19T12:26:28.407 回答