如何在Slack中显示Robotframework测试结果摘要

时间:2017-05-04 21:13:20

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

我正在使用RobotFramework在jenkins上执行我的测试并使用slack插件在slack上显示测试执行状态。但是我想像下面那样显示测试摘要

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

我通过一篇很好的文章来展示黄瓜测试结果,但是找不到机器人框架的任何文档。 http://dev.venntro.com/2016/11/reporting-cucumber-results-in-slack/

2 个答案:

答案 0 :(得分:2)

Slack通知是框架和工具不可知的,这意味着适用于黄瓜或其他系统的任何内容都适用于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运行器和rebot结果解析器将失败案例的数量作为RC(返回码)返回,这很容易获得(bash中的$?是最后执行的命令/程序的RC。)

更多“高级”是解析output.xml文件 - 它非常简单,结构合理 有一个顶级标记<total>,用于保存整体结果,例如:

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

因此,如果您解析(或grep)其“All Tests”<stat>子项,您可以获得失败/通过及其总计数;类似于运行时间。

最后,为了完全控制,可以使用robot.rebot  和robot.result包,提供对结果的完全访问权限,因此可以生成所需的任何输出。

我在没有提及Jenkins Slack插件的情况下回答了你的问题有几个原因 - a)我无法访问它(但想到它,我应该在其中一天尝试一下), b)它最有可能在相同的松散api功能上提供便利包装,并且c)http api是通用的,因此可以用于公司的任何流程。

答案 1 :(得分:0)

对于在这里遇到类似问题的其他人,我找到的解决方案就是

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

然后,机器人命令如下所示,其中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测试结果。

Sample Slack Output