【问题标题】:How to display Robotframework test results summary in Slack如何在 Slack 中显示 Robotframework 测试结果摘要
【发布时间】:2017-10-03 05:19:54
【问题描述】:

我正在使用 RobotFramework 在 jenkins 上执行我的测试,并使用 slack 插件在 slack 上显示测试执行状态。但我想显示测试摘要,如下所示

           Total Tests : 50
           Total Passed : 40
           Total Failed : 10

我浏览了一篇关于在 slack 上显示黄瓜测试结果的好文章,但找不到任何有关机器人框架的文档。 http://dev.venntro.com/2016/11/reporting-cucumber-results-in-slack/

【问题讨论】:

    标签: jenkins jenkins-plugins robotframework slack-api slack


    【解决方案1】:

    Slack 通知与框架和工具无关,这意味着适用于 cucumber 或其他系统的任何东西都适用于 Robot Framework。

    他们提供solid api 用于发送消息,我建议incoming webhooks 既简单又强大 - 特定有效负载的 http POST 有效负载在您选择的频道中显示为消息,带有支持格式化、附件等。

    这是一个简单的例子,取自引用的文档页面:

    curl -X POST \
    --data-urlencode 'payload={"text": "This is posted to #general and comes from *monkey-bot*.", "channel": "#general", "link_names": 1, "username": "monkey-bot", "icon_emoji": ":monkey_face:"}' \
     https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
    

    最简单的选项——我个人用于日常健康运行通知——是“Slackbot 远程控制”;简而言之,您为一个帐户启用它,并通过向端点发送一个 POST,一条消息被传递到目标通道 - 没有 json,没有花哨的东西。示例:

    curl --data "The full run finished against \`$current_version\`, with $number_of_failed failed cases; full results at http://the_internal_reporting_server/report.html"  \
    $'https://yourdomain.slack.com/services/hooks/slackbot?token=XXXXXXXXXXXXXXXXXXXXXXXX&channel=%23automation-results'
    

    如您所见,消息正文支持简单格式(` 转义,* 表示粗体等),并且 http 链接会在客户端中自动突出显示。要发送到的通道是端点的参数;再简单不过了:)


    该特定示例来自 bash 脚本,因此其中的变量。这导致 - 如何获取输出数据。

    那里有几个选项 - robot/pybot runner 和 rebot 结果解析器将失败案例的数量返回为 RC(返回代码),这很容易得到($? in bash是最后执行的命令/程序的 RC)。

    更“高级”的是解析 output.xml 文件 - 它相当简单且结构良好。
    有一个顶级标签<total>,它保存了整体结果,例如:

    <total>
    <stat fail="22" pass="849">Critical Tests</stat>
    <stat fail="22" pass="849">All Tests</stat>
    </total>
    

    因此,如果您解析(或 grep)其“所有测试”&lt;stat&gt; 子项,则可以从中获取失败/通过和总数;运行时间类似。

    最后,为了完全控制,可以使用robot.rebotrobot.result 包,它们提供对结果的完全访问,因此需要任何输出生成。


    我已经回答了您的问题,但没有提及 Jenkins Slack 插件,原因有两个 - a) 我无法访问它(但想想看,我应该在这些日子里尝试一下), b) 它很可能在相同的 slack api 功能上提供了方便的包装器,并且 c) http api 是通用的,因此可以在公司拥有的任何流程中使用。

    【讨论】:

      【解决方案2】:

      对于遇到类似问题的其他人,我为这种情况找到了解决方案。

      我利用机器人框架中可用的Listener Interface 来触发我的消息松弛。使用 close 方法作为 slack 消息的触发器,使用 end_test 和 end_suite 方法来跟踪字典中的测试和套件结果。

      robot 命令如下所示,URL 和频道在侦听器的路径后用分号分隔符传递(在本例中为 RobotListener.py):

      robot --listener C:\Users\cullzie\RobotListener.py;https://hooks.slack.com/services/ABCDED/12345/XYZW;cullzie test_suites\
      

      我的监听器的代码如下:

      import os
      import json
      import requests
      
      from collections import Counter
      
      class RobotListener(object):
          ROBOT_LISTENER_API_VERSION = 3
          HEADERS = {'Content-Type': 'application/json'}
      
          def __init__(self, webhook_url, channel, icon=':squirrel:'):
              self.webhook_url = webhook_url
              self.channel = channel
              self.icon = icon
              self._suite_status = dict()
              self._test_status = dict()
      
          def end_test(self, data, result):
              self._test_status[data] = result.passed
      
          def end_suite(self, data, result):
              self._suite_status[data] = self._test_status
              self._test_status = dict()
      
          def close(self):
              attachments = self._build_overall_results_attachment()
              self._send_slack_request(attachments)
      
          def _build_overall_results_attachment(self):
              results = {k: v for test_results in self._suite_status.values() for k, v in test_results.iteritems()}
              return [
              {
                  "pretext": "*All Results*",
                  "color": "good" if all(results.values()) else "danger",
                  "mrkdwn_in": [
                      "pretext"
                  ],
                  "fields": [
                      {
                          "title": "Tests Passed",
                          "value": Counter(results.values())[True],
                          "short": True
                      },
                      {
                          "title": "Total Tests",
                          "value": len(results.values()),
                          "short": True
                      },
                      {
                          "title": "Pass Percentage",
                          "value": "{0:.2f}%".format(float((Counter(results.values())[True])/float(len(results))) * 100),
                          "short": True
                      },
                      {
                          "title": "Results",
                          "value": os.environ['bamboo_resultsUrl'],
                          "short": True} if os.environ.get('bamboo_resultsUrl', False) else None,
                  ],
              }]
      
          def _send_slack_request(self, attachments):
              try:
                  data = {"channel": "@{0}".format(self.channel), "username": "ufgatestbot", "attachments": attachments,
                      "icon_emoji": self.icon}
      
                  response = requests.post(url=self.webhook_url, data=json.dumps(data), headers=self.HEADERS)
                  if response.status_code != 200:
                      print 'Error in sending data to Slack - Status Code: {0}, Text: {1}'.format(response.status_code,
                                                                                              response.content)
              except Exception as e:
                  print str(e)
      

      目前它被配置为提供指向 Atlassain Bamboo 测试结果的链接,但可以轻松更新以链接到 Jenkins 测试结果。

      【讨论】:

        猜你喜欢
        • 2020-03-24
        • 2014-05-15
        • 2015-05-28
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        相关资源
        最近更新 更多