一、使用背景:
當我們寫了一套接口自動化腳本之后,希望每天測試不通過的用例可以及時的通知到測試人員。除了發送測試報告到郵件之外,還可以使用釘釘-群機器人這個工具,每天以推送的形式告知到測試人員。那接下來我們需要了解釘釘群機器人的推送機制。
二、釘釘消息推送
具體可參考官方文檔: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上,設置每天定時構建,就可實現每天監控接口的情況啦~
