背景
有时候用例执行完,为了有个直观的结果,可以结合钉钉群自定义机器人发送我们的执行结果,这里需要使用到一个插件,pytest-json-report(可以报告摘要、测试细节、捕获的输出、日志、异常回溯等等)。
- 如果我们只是想拿到用例执行的结果,执行命令可添加如下参数: ```python —json-report —json-report-summary
示例
python -m pytest test.py -v -s -n auto —json-report —json-report-summary
默认生成.report.json文件,示例如下:<br />更多详情见:[https://pypi.org/project/pytest-json-report/](https://pypi.org/project/pytest-json-report/)
```json
{
"created":1622290482.970531,
"duration":12.282971143722534,
"exitcode":0,
"root":"/Users/zaygee/CodeMao/kitten_api_auto_test",
"environment":{
"Python":"3.7.7",
"Platform":"Darwin-20.3.0-x86_64-i386-64bit",
"Packages":{
"pytest":"6.1.2",
"py":"1.9.0",
"pluggy":"0.13.1"
},
"Plugins":{
"json-report":"1.3.0",
"xdist":"2.2.1",
"metadata":"1.11.0",
"Faker":"5.0.2",
"allure-pytest":"2.8.22",
"forked":"1.3.0"
}
},
"summary":{
"collected": 10,
"passed": 2,
"failed": 3,
"xfailed": 1,
"xpassed": 1,
"error": 2,
"skipped": 1,
"total": 10
}
}
�
自定义钉钉机器人通知实现代码示例如下:
这里我们选择的通知格式是markdown,根据详情见钉钉官方文档:钉钉群自定义机器人通知
# -*- coding: utf-8 -*-#
# file: dingtalk
# Author: ShunZhe
# Date: 2021/5/28
"""钉钉通知"""
import json
import os
import requests
from common import logger
headers = {
"Content-Type": "application/json; charset=UTF-8"
}
def get_results_data():
"""读取json文件获取用例执行汇总数据"""
with open('.report.json', 'r') as file:
data = file.read()
if data is not None and data != '':
sum_data = json.loads(data)
else:
return
return sum_data
class DingTalk:
"""钉钉群测试报告通知"""
def __init__(self):
self.req = requests.session
ding_url = 'https://oapi.dingtalk.com/robot/send?access_token=4545454' # Webhook地址
@classmethod
def data(cls, results_data):
if results_data is not None and len(results_data) > 0:
duration = round(results_data.get('duration'), 2)
results_data = results_data.get('summary')
else:
return
ding_data = {
"msgtype": "markdown",
"markdown": {
"title": "接口测试报告",
"text": "### **Kitten 接口测试报告** \n >"
f"#### 执行环境: {os.environ.get('env').capitalize()} 环境 \n >"
f"#### 成功用例: {results_data.get('passed', 0)} 条 \n >"
f"#### 失败用例:{results_data.get('failed', 0)} 条\n > "
f"#### 跳过用例:{results_data.get('skipped', 0)} 条\n > "
f"#### 其他错误:{results_data.get('error', 0)} 条\n > "
f"#### 执行总时间:{round(duration / 60, 2)} min\n > "
"![screenshot](https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1189571765,"
"1557082501&fm=26&gp=0.jpg) \n "
"###### 更多详情见 [报告地址](https://jenkins.codemao.cn/job/auto_test/job/K4Api_Auto_Test/allure/) \n"
},
"at": {
"atMobiles": [
# 被@人的手机号
],
"atUserIds": [
# 被@人的用户userid
],
"isAtAll": False # 是否@所有人
}
}
return ding_data
def post_req(self, post_data):
res = self.req().post(self.ding_url, data=json.dumps(post_data), headers=headers)
logger.info("钉钉通知调用结果:" + str(res.text))
常见问题:
// 消息内容中不包含任何关键词
{
"errcode":310000,
"errmsg":"keywords not in content"
}
// 解决办法:钉钉群机器人添加相应的关键词
结果如图所示: