UI自动化框架使用 Python+requests+Pymysql+openpyxl 模块组成
使用 Docker 搭建本地 Jenkins 或者 线上服务
注册 Gltlab 账号,并创建一个项目,这里我的项目名是 api-auto-test(下面简称接口自动化测试)
GitLab、Generic Webhook Trigger、Git Parameter,安装完插件重启系统:
系统配置->Manage Credentials
Gitlab API 如何获取呢!请看下图
点击 创建个人访问令牌
会生成一串 ID,点击 复制
粘贴到 Gitlab 凭证内
点击 Create
系统管理->Configure System
Connection name:名称随意写
Gitlab host URL:gitlab地址
Credentials:选择已添加的 Gitlab 凭证
点击 Test Connttion 返回 Success 表示链接成功
系统配置->Manage Credentials
类型选择:Username with password
用户名/密码:填写 gitlab的登录用户名和密码
GitLab connection:自动选择 Gitlab 链接名称
Repository URL: 填写 gitlab 仓库地址
Credentials: 选择已添加的 gitlab 账号密码链接
高级:
Name:填写 origin
Refspec: 填写+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*(通配符)
Branches to build: 填写 */main
Gitlab 仓库地址获取⬇️
构建成功,代码拉取成功
构建成功,查看详情
要知道HTML报告名称是使用什么组成的
比如报告名称:2023-03-02_13:02_接口自动化测试报告.html
那Jenkins内如何写呢
任务->构建后操作->选择 Publish HTML reports
HTML directory to archive:报告存放路径(按照实际情况填写)
Index page[s]:拼接类型的报告名称
Report title:jenkins内展示的报告名称
${BUILD_TIMESTAMP} 变量如何获取呢!请看下图
系统配置-> Configure System 找到Build Timestamp 直接引用变量名就ok啦!(需要下载时间插件)
如果出现报告样式丢失,在构建后操作内选择 Groovy Postbuild 填写以下 代码
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
System.setProperty("org.apache.commons.jelly.tags.fmt.timeZone","Asia/Shanghai")
任务->构建后操作->Editable Email Notification
Project Recipient List:填写收件人邮箱
Content Type:选择HTML类型
Default Subject:填写 邮件名称
Attachments:填写绝对报告路径地址
Default Content:填写以下报告样式
${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志
本邮件由系统自动发出,无需回复!
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息
构建结果 - ${BUILD_STATUS}
构建信息
- 项目名称:${PROJECT_NAME}
- 构建编号:第${BUILD_NUMBER}次构建
- 触发原因:${CAUSE}
- 构建状态:${BUILD_STATUS}
- 构建日志:${BUILD_URL}console
- 构建 Url:${BUILD_URL}
- 工作目录:${PROJECT_URL}ws
- 项目 Url:${PROJECT_URL}
创建 脚本 如下:
import requests
import json
import urllib3
import sys
import re
from datetime import datetime
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class InformRobot:
def __init__(self):
self.sess = requests.session()
self.test_case_quantity_rate = ""
self.test_use_case_pass = ""
self.test_use_case_fail = ""
self.test_use_case_skip = ""
self.test_case_run_time = ""
def markdown_robot(
self, webhook_url, job_name
):
"""
实现企业微信通知
:param webhook_url: 企业微信token
:param report_url: 报告地址
:param principal: 负责人名称
:param job_name: 项目名称
:return:
"""
data = {
"msgtype": "markdown", # 消息类型,此时固定为markdown
"markdown": {
"content": f"### 提醒! {job_name} 接口自动化测试反馈 \n "
f">项目名称:DSP测试环境 \n"
f">测试用例总数: {self.test_case_quantity_rate} \n"
f">测试用例通过: {self.test_use_case_pass} \n"
f">测试用例失败: {self.test_use_case_fail} \n"
f">测试用例跳过: {self.test_use_case_skip} \n"
f">测试用例运行时间: {self.test_case_run_time}s \n"
f">测试报告链接:[点击报告查看详情]({reports_url}) \n"
f">测试负责人:{principal}"
}
}
re_post = self.sess.post(webhook_url, data=json.dumps(data), verify=False)
print(re_post.content, data)
return re_post
def result_pass_rate(self, html_path):
with open(html_path, "r", encoding="utf-8") as f:
report = f.read()
case_quantity_rate = re.findall('\d+', str(re.findall('"testAll":(.*?),', report))) # 获取用例总数
use_case_pass = re.findall('\d+', str(re.findall('"testPass":(.*?),',report))) # 获取用例通过
use_case_fail = re.findall('\d+', str(re.findall('"testFail":(.*?),',report))) # 获取用例失败
use_case_skip = re.findall('\d+', str(re.findall('"testSkip":(.*?),',report))) # 获取用例跳过
test_case_run_time = re.findall('\d+', str(re.findall('"totalTime":(.*?),',report))) # 获取用例运行时间
self.test_case_quantity_rate = case_quantity_rate[0] # 获取用例总数
self.test_use_case_pass = use_case_pass[0] # 获取用例通过
self.test_use_case_fail = use_case_fail[0] # 获取用例失败
self.test_use_case_skip = use_case_skip[0] # 获取用例跳过
self.test_case_run_time = test_case_run_time[0] # 获取用例运行时间
if __name__ == '__main__':
#===============================jenkins内执行====================================#
datetime = datetime.now().strftime('%Y-%m-%d_%H:%M') # 获取本地时间
print(datetime)
reports_url = 'http://127.0.0.1:2587/{}_接口自动化测试报告.html'.format(datetime) #报告对外访问
print(reports_url)
webhook_url = sys.argv[1] #必填参数
job_name = sys.argv[2] #必填参数
principal = sys.argv[3] #必填参数
path = "/var/jenkins_home/workspace/{}/reports/{}_接口自动化测试报告.html".format(job_name,datetime) #报告路径
info_robot = InformRobot()
info_robot.result_pass_rate(path)
info_robot_res = info_robot.markdown_robot(webhook_url,job_name)
print(info_robot_res)
info_robot.sess.close()
# 自定义企业微信通知
python3 "webhook/webhook.py" ${webhook_url} ${JOB_NAME} ${principal}
点击 应用 并保存
参考:从零打造属于自己的CI/CD Jenkins+Apifox (四)
⚠️注意:nginx只能监听一个报告路径对应的一个端口,所有 需要重新运行Jenkins镜像,并填写多个端口。
路径:vi /etc/nginx/nginx.conf,配置后记得重启nginx
构建成功,企业微信内查看报告
点击报告链接
任务->构建触发器 勾选 Build when a change is pushed to GitLab. GitLab CI Service URL: http://127.0.0.1:8089/project/gitlab-api-auto-test
网址:粘贴 URL
Secret token:粘贴 生成的密码
触发来源 全部勾选