一、使用背景:
当我们写了一套接口自动化脚本之后,希望每天测试不通过的用例可以及时的通知到测试人员。除了发送测试报告到邮件之外,还可以使用钉钉-群机器人这个工具,每天以推送的形式告知到测试人员。那接下来我们需要了解钉钉群机器人的推送机制。
二、钉钉消息推送
具体可参考官方文档:https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots
1.创建机器人
步骤一,在PC端钉钉上建立群聊,点击群设置,选择“机器人管理”。
步骤二,在机器人管理页面选择“自定义”机器人,输入机器人名字,同时可以为机器人设置机器人头像。
步骤三,完成必要的安全设置(至少选择一种),这里我选择的是自定义关键词,勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”。安全设置目前有3种方式,设置说明见官方文档介绍。
步骤四,完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX
三、封装钉钉推送方法
在我们创建了钉钉群机器人之后,接下来我们就需要封装一个发送钉钉推送的方法。
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
def dingding(api_name):
# 第一步,把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。
timestamp = str(round(time.time() * 1000))
secret = '哈哈哈哈哈哈哈哈这是个秘密'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
# 第二步,把 timestamp和第一步得到的签名值拼接到URL中。
Webhook_url = "https://oapi.dingtalk.com/robot/send"
payload = {
'access_token': '6451829c9a9607b1cff114320f0909ca866644387a81052a321c1d5be74734d6',
'timestamp': timestamp,
'sign': sign
}
print(payload)
# 第三步,发送消息text类型或者link类型、markdown类型、跳转ActionCard类型
body = {
"msgtype": "text",
"text": {
"content": "测试不通过,接口名称:%s" % api_name
},
"at": {
"atMobiles": [
],
"isAtAll": False
}
}
headers = {'Content-Type': 'application/json; charset=utf-8'}
r = requests.post(Webhook_url, params=payload, headers=headers, json=body)
print(r.url)
print(r.text)
简单来说有三个步骤
1.把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlencode,得到最终的签名(需要使用UTF-8字符集)。
2.把timestamp和第一步得到的签名值拼接到url中。
3.发送消息text类型或者link类型、markdown类型、跳转ActionCard类型
需要注意的是:由于我在创建机器人的时候选择安全设置是自定义关键词,因此发送的消息中必须至少含有1个关键词才能成功发送。
例如:添加了一个自定义关键词:测试不通过
则这个机器人所发送的消息,必须包含 测试不通过 这个词,才能发送成功。
四、当测试用例断言失败时调用钉钉推送方法
钉钉推送的方法已经封装好了,接下来就是需要当我们测试用例断言失败的时候去调用该方法就行了。可我们知道,当测试用例一到断言之后,后面的代码就不会再继续运行了。那我们要如何去调用该方法,这里我是用了Hooks函数的pytest_runtest_makereport去获取用例的执行结果。
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
# print('------------------------------------')
# 获取钩子方法的调用结果
out = yield
print('用例执行结果', out)
# 3. 从钩子方法的调用结果中获取测试报告
report = out.get_result()
print('测试报告:%s' % report)
print('步骤:%s' % report.when)
print('nodeid:%s' % report.nodeid)
print('description:%s' % str(item.function.__doc__))
print(('运行结果: %s' % report.outcome))
运行一个测试用例后,可以看到以下的结果
这里拿到了运行结果,那接下来就好办了
if report.outcome == "failed":
dingding(str(item.function.__doc__))
dingding()后面的参数我传的是该用例的名称,方便在钉钉群机器人推送的时候可以直接看到是哪个接口有问题。
五、运行结果
在做完以上所有步骤后,接下来就可以看到效果啦
最后再把项目搭建在jenkins上,设置每天定时构建,就可实现每天监控接口的情况啦~