我正在使用RobotFramework在jenkins上执行我的测试并使用slack插件在slack上显示测试执行状态。但是我想要显示测试摘要,如下所示
Total Tests : 50
Total Passed : 40
Total Failed : 10
我找到了一篇很好的文章,用于显示松弛的黄瓜测试结果,但找不到机器人框架的任何文档。 http://dev.venntro.com/2016/11/reporting-cucumber-results-in-slack/
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)它的“所有测试”<stat>
孩子,你可以得到失败/通过和它的总数;类似的运行时间。
最后,对于完全控制,可以使用robot.rebot和robot.result包,它们提供对结果的完全访问,因此需要任何输出生成。
我已经回答了你的问题而没有提到Jenkins Slack插件有几个原因 - a)我无法访问它(但想到它,我应该试试这些日子之一),b)它最有可能提供相同的松散api功能的便利包装,以及c)http api是通用的,因此可以用于公司的任何流程。
对于遇到类似问题的其他人来说,就是我找到的解决方案。
我利用机器人框架中可用的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)
目前它被配置为提供Atlassian Bamboo测试结果的链接,但可以轻松更新以链接到Jenkins测试结果。