2

背景

这是配置的背景

  • 我有用 Robot Framework 编写的测试
  • 我正在使用 Jenkins 并安装了 robotframework 和 email-ext 插件
    • 我有一个计划定期运行的 Jenkins 工作
      • jenkins 作业运行机器人测试
      • 然后发送一封包含测试结果的电子邮件(使用 email-ext)
      • 我正在使用一个 groovy 脚本来生成电子邮件内容。

生成电子邮件内容的常规脚本使用机器人 API来获取数据(例如:总测试、总失败、通过百分比)和有关所有失败测试用例的信息。

对于所有失败的测试用例,RoboCaseResult 列表,我包括:

  • 测试关键性
  • 家长套房
  • 测试名称
  • 错误信息

这目前正在工作。这是我的 Groovy 脚本实现了这一点:

def actionslist = build.actions // List<hudson.model.Action>
def doRobotResultsExist = false
actionslist.each() { action ->
    if( action.class.simpleName.equals("RobotBuildAction") ) { // hudson.plugins.robot.RobotBuildAction
        doRobotResultsExist = true
        displaycritical = (action.getOverallPassPercentage() != action.getCriticalPassPercentage())
        %>
        <h3>RobotFramework Results</h3>
        <table>
            <tr>
                <td>Detailed Report:</td>
                <td><a href="${rooturl}${build.url}robot/report/<%= action.getLogHtmlLink() %>" target="_new"><%= action.getLogHtmlLink() %></a></td>
            </tr>
            <!--
            <tr>
                <td>Pass Percentage:</td>
                <td><%= action.overallPassPercentage %>%</td>
            </tr>
            -->
            <tr>
                <td>Overall Pass Ratio:</td>
                <td><%= action.getTotalCount() - action.getFailCount() %>/<%= action.getTotalCount() %></td>
            </tr>
            <tr>
                <td>Pass Percentage:</td>
                <td><%= action.getOverallPassPercentage() %>%</td>
            </tr>
            <% 
            if (displaycritical) {
            %>
            <tr>
                <td>Critical Pass Percentage:</td>
                <td><%= action.getCriticalPassPercentage() %>%</td>
            </tr>
            <% } //if displaycrital %>
            
            <tr>
                <td>Total Failed:</td>
                <td><%= action.getFailCount() %></td>
            </tr>
        </table>
        <%
        //action.result returns  hudson.plugins.robot.model.RobotResult
        //action.retult.getAllFailedCases() returns a list of hudson.plugins.robot.model.RobotCaseResult
        def allFailedTests = action.result.getAllFailedCases() // hudson.plugins.robot.model.RobotCaseResult
        
        if (!allFailedTests.isEmpty()) {
            i = 0
            %>
            <table cellspacing='0' cellpadding='1' border='1'>
            <tr class='bg1'>
                <% if (displaycritical) { %><th>Tagged Critical</th><% } //if displaycrital %>
                <th>Suite</th>
                <th>Failed Test Case</th>
                <th>Error message</th>
            </tr>
            <%
            //allFailedTests.each() { testresult ->
            //    def testCaseResult = testresult
            allFailedTests.each() { testCaseResult ->
                i++
                print "<tr " + ( (i % 2) == 0 ? "class='bg2'" : "") + " >"
                if (displaycritical) {
                    print "<td>" + (testCaseResult.isCritical()? "<font color='red'><b>YES</b></font>": "no" )+ "</td>"
                }
                print "<td>" + testCaseResult.getParent().getRelativePackageName(testCaseResult.getParent()) + "</td>"
                print "<td>" + testCaseResult.getDisplayName() + "</td>"
                print "<td>" + testCaseResult.getErrorMsg() + "</td>"
                print "</tr>"
            } // for each failed test
            %>
            </table>
            <%
        } // if list of failed test cases is not empty
    } // end action is RobotBuildAction
} // end of each actions

这产生了这样的东西

==================================================== ========================
| 标记为关键 | 套房 | 失败的测试用例 | 错误信息 |
==================================================== ========================
| 是 | 水果 | 获取苹果 | 买不到苹果 |
+-----------------+--------+------------------+--- ----------------------+
| 否 | 水果 | 吃苹果 | 找不到苹果 |
==================================================== ========================

问题

对于每个失败的测试用例,我想包括所有引发的 WARNING。但我无法为此找到 API,因此我针对 Jenkins 插件打开了增强票证。Jenkins 机器人框架插件维护者可能不会在我需要解决方案的时间范围内回复我的请求。

如何通过 groovy 脚本包含机器人测试期间引发的所有警告?也就是说,我想得到以下

==================================================== ===============================================
| 标记为关键 | 套房 | 失败的测试用例 | 错误信息 | 警告 |
==================================================== ===============================================
| 是 | 水果 | 获取苹果 | 买不到苹果 | 没有可用的篮子 |
+-----------------+--------+------------------+--- ----------------------+----------+
| 否 | 水果 | 吃苹果 | 找不到苹果 | |
==================================================== ===============================================
4

1 回答 1

3

我不熟悉机器人插件 API,所以我不能说你想要的信息是否可以从那里获得。我知道的是该信息在机器人生成的 output.xml 文件中可用。这个文件很容易解析。以下是使用一个 log 关键字的测试生成的文件的顶部:

<robot generated="20140527 19:46:02.095" generator="Robot 2.8.1 (Python 2.7.2 on darwin)">
  <suite source="/tmp/example.robot" id="s1" name="Example">
    <test id="s1-t1" name="Example of a warning">
      <kw type="kw" name="BuiltIn.Log">
        <doc>Logs the given message with the given level.</doc>
          <arguments>
            <arg>This is a warning</arg>
            <arg>warn</arg>
          </arguments>
          ...

另一种解决方案是创建一个自定义侦听器,用于侦听警告和错误消息,保存它们,然后在测试运行时动态创建您的电子邮件消息。每次收到end_test消息时,您都可以打印到该点检测到的任何错误或警告。套件运行完毕后,您就可以准备好发送电子邮件了。

以下是一个简单的示例,尽管它没有给出您想要的确切输出(我懒得计算每列的最大宽度):

class exampleListener():
    ROBOT_LISTENER_API_VERSION = 2

    def __init__(self, filename="messages.txt"):
        self.outfile = open(filename, "w")
        self.outfile.write("Errors and Warnings\n")
        self.current_test = None
        self.current_messages = []
        self.current_suite = None

    def start_suite(self, name, attrs):
        self.current_suite = name

    def start_test(self, name, attrs):
        self.current_test = name
        self.current_messages = []

    def log_message(self, data):
        self.current_messages.append((data["level"], data["message"]))

    def end_test(self, name, attrs):
        for (type, text) in self.current_messages:
            if type == "ERROR":
                self.outfile.write("| %s | %s | %s\n" % (self.current_suite, self.current_test, text))
            elif type == "WARN":
                self.outfile.write("| %s | %s | | %s\n" % (self.current_suite, self.current_test, text))

        self.current_messages = []
        self.current_test = None

    def end_suite(self, name, attrs):
        self.outfile.close()

您可以通过使用 --listener 参数来使用它,例如:

pybot --listener ExampleListener.py my_suite
于 2014-05-28T00:50:27.447 回答