当前位置:   article > 正文

Jenkins教程-12-发送html邮件测试报告

Jenkins教程-12-发送html邮件测试报告

上一小节我们学习了发送钉钉测试报告通知的方法,本小节我们讲解一下发送html邮件测试报告的方法。

1、自动化用例执行完后,使用pytest_terminal_summary钩子函数收集测试结果,存入本地status.txt文件中,供Jenkins调用

  1. #conftest.py
  2. def pytest_terminal_summary(terminalreporter, exitstatus, config):
  3. """收集测试报告summary,并存入status.txt文件中,供Jenkins调用"""
  4. print("pytest_terminal_summary")
  5. passed_num = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])
  6. failed_num = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])
  7. error_num = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])
  8. skipped_num = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])
  9. total_num = passed_num + failed_num + error_num + skipped_num
  10. test_result = '测试通过' if total_num == passed_num + skipped_num else '测试失败'
  11. duration = round((time.time() - terminalreporter._sessionstarttime), 2)
  12. # 定义目录路径
  13. directory_path = './reports/'
  14. # 确保文件所在的目录存在
  15. os.makedirs(os.path.dirname(directory_path), exist_ok=True)
  16. # 定义文件路径
  17. file_path = os.path.join(directory_path, 'status.txt')
  18. with open(file_path, 'w', encoding='utf-8') as f:
  19. f.write(f'TEST_TOTAL={total_num}\n')
  20. f.write(f'TEST_PASSED={passed_num}\n')
  21. f.write(f'TEST_FAILED={failed_num}\n')
  22. f.write(f'TEST_ERROR={error_num}\n')
  23. f.write(f'TEST_SKIPPED={skipped_num}\n')
  24. f.write(f'TEST_DURATION={duration}\n')
  25. f.write(f'TEST_RESULT={test_result}\n')

本地文件status.txt中收集测试结果示例:

2、Jenkins中安装Environment Injector description setter 插件

Environment Injector插件用于注入环境变量

自动化测试任务配置中,添加构建步骤

填写测试结果收集文件status.txt的路径

description setter用于构建后设置任务描述

将status.txt中的的测试结果字段映射到任务描述中

执行任务构建后,任务描述中会有显示构建的测试结果,如下

3、安装python-jenkins 库,读取自动化测试任务构建后的测试结果描述信息

pip install python-jenkins

代码如下

  1. # email_remind.py
  2. import json
  3. from datetime import datetime
  4. import jenkins
  5. import requests
  6. import jmespath
  7. host = "http://localhost:8080/"
  8. username = 'admin'
  9. password = 'xxxxxxxxxx'
  10. webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f4444444444-c1d3-47f2-be78-098f80c2d194"
  11. env = "test"
  12. stage = "回归测试"
  13. job = "auto_api_test"
  14. maintainer = "米兔1号"
  15. server = jenkins.Jenkins(host, username=username, password=password)
  16. last_build_number = server.get_job_info(job)['lastCompletedBuild']['number']
  17. build_info = server.get_build_info(job, last_build_number)
  18. console_url = build_info['url'] + "console"
  19. report_url = build_info['url'] + 'allure'
  20. # report_url = ip_host + report_url.split(":")[-1]
  21. test_status = json.loads(build_info['description'])
  22. print("构建测试结果描述信息:", test_status)
  23. total = test_status["total"]
  24. passed = test_status["passed"]
  25. passed_ratio = round(passed / total, 4) * 100
  26. failed = test_status["failed"]
  27. failed_ratio = round((100 - passed_ratio), 2)
  28. error = test_status["error"]
  29. skipped = test_status["skipped"]
  30. duration = test_status["duration"]
  31. build_time = datetime.fromtimestamp(build_info['timestamp'] / 1000).strftime('%Y-%m-%d %H:%M:%S')
  32. success = total == (passed + skipped) if passed != 0 else False

执行上述代码,可以看出,已经获取到jenkins任务的测试结果信息了

4、上一步获取到的测试结果信息,包装成消息体,调用python 发送邮件的相关方法,发送邮箱消息

  1. import json
  2. import html
  3. from datetime import datetime
  4. import jenkins
  5. import smtplib
  6. from email.mime.text import MIMEText
  7. from bs4 import BeautifulSoup, NavigableString
  8. host = "http://localhost:8080/"
  9. username = 'admin'
  10. password = 'xxxxxxxxxxxx'
  11. webhook = "https://oapi.dingtalk.com/robot/send?access_token=bffb1003f5b0ac9d9be5f8c863a38e2d646a69cd231147524829ffbba10e0fa3"
  12. env = "test"
  13. stage = "回归测试"
  14. job = "auto_api_test"
  15. maintainer = "米兔1号"
  16. server = jenkins.Jenkins(host, username=username, password=password)
  17. last_build_number = server.get_job_info(job)['lastCompletedBuild']['number']
  18. build_info = server.get_build_info(job, last_build_number)
  19. print("构建信息:", build_info)
  20. console_url = build_info['url'] + "console"
  21. print("console:", console_url)
  22. report_url = build_info['url'] + 'allure'
  23. print("report_url:", report_url)
  24. test_status = json.loads(build_info['description'])
  25. print("测试结果:", test_status)
  26. total = test_status["total"]
  27. passed = test_status["passed"]
  28. passed_ratio = round(passed / total, 4) * 100
  29. print("passed_ratio", passed_ratio)
  30. failed = test_status["failed"]
  31. failed_ratio = round((100 - passed_ratio),2)
  32. print("failed:", failed_ratio)
  33. error = test_status["error"]
  34. skipped = test_status["skipped"]
  35. duration = test_status["duration"]
  36. build_time = datetime.fromtimestamp(build_info['timestamp'] / 1000).strftime('%Y-%m-%d %H:%M:%S')
  37. success = total == (passed + skipped) if passed != 0 else False
  38. sender = user = '1450xxxxxxx@qq.com' # 发送方的邮箱账号
  39. passwd = 'y222222xpbjkrdupxugcbg' # 授权码
  40. receiver = '19345678901@139.com' # 接收方的邮箱账号,不一定是QQ邮箱
  41. # 读入 html 文件的内容
  42. html_content = f"""
  43. <!DOCTYPE html>
  44. <html lang="en">
  45. <head>
  46. <meta charset="UTF-8">
  47. <title>钉钉oapi接口测试报告</title>
  48. </head>
  49. <body>
  50. <h3>钉钉oapi接口测试报告</h3>
  51. <li>【任务名称】:{job}</li>
  52. <li>【测试阶段】:{stage}</li>
  53. <li>【测试结果】:{'通过' if success else '失败'}</li>
  54. <li>【用例总数】:{total}个</li>
  55. <li>【通过数】:{passed}个</li>
  56. <li>【通过率】:{passed_ratio}%</li>
  57. <li>【失败数】:{failed}个</li>
  58. <li>【失败率】:{failed_ratio}%</li>
  59. <li>【错误数】:{error}个</li>
  60. <li>【跳过数】:{skipped}个</li>
  61. <li>【执行人】:{maintainer}</li>
  62. <li>【执行时间】:{build_time}</li>
  63. <li>【执行耗时】:{duration}</li>
  64. <li><a href={report_url}>Allure详细报告,请点击查看</a></li>
  65. <br>
  66. (本邮件由系统自动发出,请勿回复!)
  67. </body>
  68. </html>
  69. """
  70. print("html_content",html_content)
  71. # with open('1.html', mode='r', encoding='utf-8') as f:
  72. # html_content = f.read()
  73. # 指定类型是 html
  74. msg = MIMEText(html_content, 'html', 'utf-8')
  75. msg['From'] = user
  76. msg['To'] = receiver
  77. msg['Subject'] = '钉钉oapi接口测试任务执行报告通知'
  78. smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
  79. smtp.login(user, passwd)
  80. smtp.sendmail(user, receiver, msg.as_string())

查看邮件如下:

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/779153
推荐阅读
相关标签
  

闽ICP备14008679号