背景
有时候用例执行完,为了有个直观的结果,可以结合钉钉群自定义机器人发送我们的执行结果,这里需要使用到一个插件,pytest-json-report(可以报告摘要、测试细节、捕获的输出、日志、异常回溯等等)。

  1. 如果我们只是想拿到用例执行的结果,执行命令可添加如下参数: ```python —json-report —json-report-summary

示例

python -m pytest test.py -v -s -n auto —json-report —json-report-summary

  1. 默认生成.report.json文件,示例如下:<br />更多详情见:[https://pypi.org/project/pytest-json-report/](https://pypi.org/project/pytest-json-report/)
  2. ```json
  3. {
  4. "created":1622290482.970531,
  5. "duration":12.282971143722534,
  6. "exitcode":0,
  7. "root":"/Users/zaygee/CodeMao/kitten_api_auto_test",
  8. "environment":{
  9. "Python":"3.7.7",
  10. "Platform":"Darwin-20.3.0-x86_64-i386-64bit",
  11. "Packages":{
  12. "pytest":"6.1.2",
  13. "py":"1.9.0",
  14. "pluggy":"0.13.1"
  15. },
  16. "Plugins":{
  17. "json-report":"1.3.0",
  18. "xdist":"2.2.1",
  19. "metadata":"1.11.0",
  20. "Faker":"5.0.2",
  21. "allure-pytest":"2.8.22",
  22. "forked":"1.3.0"
  23. }
  24. },
  25. "summary":{
  26. "collected": 10,
  27. "passed": 2,
  28. "failed": 3,
  29. "xfailed": 1,
  30. "xpassed": 1,
  31. "error": 2,
  32. "skipped": 1,
  33. "total": 10
  34. }
  35. }


自定义钉钉机器人通知实现代码示例如下:
这里我们选择的通知格式是markdown,根据详情见钉钉官方文档:钉钉群自定义机器人通知

  1. # -*- coding: utf-8 -*-#
  2. # file: dingtalk
  3. # Author: ShunZhe
  4. # Date: 2021/5/28
  5. """钉钉通知"""
  6. import json
  7. import os
  8. import requests
  9. from common import logger
  10. headers = {
  11. "Content-Type": "application/json; charset=UTF-8"
  12. }
  13. def get_results_data():
  14. """读取json文件获取用例执行汇总数据"""
  15. with open('.report.json', 'r') as file:
  16. data = file.read()
  17. if data is not None and data != '':
  18. sum_data = json.loads(data)
  19. else:
  20. return
  21. return sum_data
  22. class DingTalk:
  23. """钉钉群测试报告通知"""
  24. def __init__(self):
  25. self.req = requests.session
  26. ding_url = 'https://oapi.dingtalk.com/robot/send?access_token=4545454' # Webhook地址
  27. @classmethod
  28. def data(cls, results_data):
  29. if results_data is not None and len(results_data) > 0:
  30. duration = round(results_data.get('duration'), 2)
  31. results_data = results_data.get('summary')
  32. else:
  33. return
  34. ding_data = {
  35. "msgtype": "markdown",
  36. "markdown": {
  37. "title": "接口测试报告",
  38. "text": "### **Kitten 接口测试报告** \n >"
  39. f"#### 执行环境: {os.environ.get('env').capitalize()} 环境 \n >"
  40. f"#### 成功用例: {results_data.get('passed', 0)} 条 \n >"
  41. f"#### 失败用例:{results_data.get('failed', 0)} 条\n > "
  42. f"#### 跳过用例:{results_data.get('skipped', 0)} 条\n > "
  43. f"#### 其他错误:{results_data.get('error', 0)} 条\n > "
  44. f"#### 执行总时间:{round(duration / 60, 2)} min\n > "
  45. "![screenshot](https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1189571765,"
  46. "1557082501&fm=26&gp=0.jpg) \n "
  47. "###### 更多详情见 [报告地址](https://jenkins.codemao.cn/job/auto_test/job/K4Api_Auto_Test/allure/) \n"
  48. },
  49. "at": {
  50. "atMobiles": [
  51. # 被@人的手机号
  52. ],
  53. "atUserIds": [
  54. # 被@人的用户userid
  55. ],
  56. "isAtAll": False # 是否@所有人
  57. }
  58. }
  59. return ding_data
  60. def post_req(self, post_data):
  61. res = self.req().post(self.ding_url, data=json.dumps(post_data), headers=headers)
  62. logger.info("钉钉通知调用结果:" + str(res.text))

常见问题:

  1. // 消息内容中不包含任何关键词
  2. {
  3. "errcode":310000,
  4. "errmsg":"keywords not in content"
  5. }
  6. // 解决办法:钉钉群机器人添加相应的关键词

结果如图所示:
image.png