持续集成 Jenkins + appium + jmeter + 钉钉消息推送

周小丽 · 2021年06月15日 · 最后由 小目标胖三斤 回复于 2021年06月15日 · 4792 次阅读

测试环境:jenkins 部署在 linux 系统,appium 和 jmeter 部署在 windows。所以需要启用节点服务器。测试结果通过钉钉机器人发布到钉钉群中

启用节点服务器

1、新增节点

2、将下载后的文件放到 windows 的 C:\jenkins 下,双击运行

3、此时在 linux 下可看见 windows 节点连接正常

钉钉机器人配置

1、钉钉群创建钉钉机器人

2、系统管理 -- 系统配置,配置钉钉通知消息

创建 jmeter 工程

1、工程配置

备注:需要将 windows 的报告先删除,否则不能生成新的报告。
通过命令窗口生成 jmeter 报告命令

cd/
C:
del /s /Q C:\jenkins\workspace\jmeter_ZnbApp\result.txt
del /s /Q C:\jenkins\workspace\jmeter_ZnbApp\表格查看结果-协保通.csv
del /s /Q C:\jenkins\workspace\jmeter_ZnbApp\表格查看结果-智农保.csv
rd /s /Q C:\jenkins\workspace\jmeter_ZnbApp\webreport
cd C:\apache-jmeter-5.3\bin
jmeter -n -t C:\apache-jmeter-5.3\智农保\智农保APP.jmx -l C:\jenkins\workspace\jmeter_ZnbApp\result.txt -e -o 

构建完成后自动发送钉钉消息,命令如下

python C:\jenkins\workspace\jmeter_ZnbApp\Ding_send.py

备注:要成果发送钉钉消息,首先需要通过钉钉群创建钉钉机器人


备注:publish 的工程是将 windows 下生成的测试报告文件推送到 jenkins 所在服务器上。因为:jmeter 所在的服务器是 windows 的,在 windows 节点服务器上操作 xshell 命令总报错。所以才启用下一个 linux 工程上操作 xshell 的 scp 命令。

创建 publish 工程

1、工程配置

#!/bin/bash
scp -r zxl@192.168.1.61:c:/jenkins/workspace/jmeter_ZnbApp/webreport /usr/local/apache-tomcat-7.0.108/webapps/jobs/jmeter_ZnbApp/builds/${BUILD_NUMBER}/webreport

备注:192.168.1.61 是 windows 服务器,windows 要与 linux 通讯,需要在 windows 安装 winSSHD 配置 ssh 虚拟用户

appium 工程的配置


备注:需要在源码中添加如下部分,否则通过命令行窗口运行时会报找不到各种包的错误,但在 PyCharm 中运行是没问题的,因为在 PyCharm 中环境配置是集成好的,但在命令行窗口却找不到包

import os
import sys
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)

windows 安装 winSSHD 配置 ssh 虚拟用户

链接:https://pan.baidu.com/s/1d8izC-qJb2H22rgsUuXbfg 提取码:7jwl,来源于他人网页上的配置方式https://www.cnblogs.com/sixfiv/p/9771770.html
1、打开软件,界面如下

2、选择 personnel edition 后点击安装等待安装结束

3、安装结束后开始配置

4、选择使用本地账户进行登录

5、保存上面配置,开启服务准备测试

6、创建虚拟账号进行连接


注意:publick keys:需要将 linux 服务器上的公钥上传添加到此处

jenkins 系统配置中 ssh 配置

钉钉消息通知消息体 python 脚本

jmeter 对应的 python 脚本

#!\usr\bin\python3.7
# coding=utf-8
import json
import os
import datetime
import time
import linecache
from time import strftime
from requests import session

def nail_inform(statis):

    # 钉钉接口与机器人token
    url = "https://oapi.dingtalk.com/robot/send?" \
          "access_token=af53ebed900ca961cac007983ff1a39d3812e9181ca8d........."

    # 头部信息(Content-Type必填)
    header = {
        "Content-Type": "application/json",
        "Charset": "UTF-8"
    }

    now = strftime("%Y-%m-%d %H:%M:%S")  # 获取测试时间
    msg = "报告名称   :  智农宝app接口测试\n" \
          "报告地址   :  http://.............../jobs/jmeter_ZnbApp/builds/%s/webreport\n" \
          "测试时间   :  %s\n" \
          "总的接口数:  %s\n" \
          "失败接口数:  %s\n" \
          "平均响应时间ms:  %s\n\n" % (statis["number"], now, statis["sum"], statis["fail"], statis["ratio"])

    payload = {
        "msgtype": "text",
        "text": {
            "content": "自动化测试\n" + msg  # 抓取数据发送的内容放到msg
        },
        "at": {
            "isAtAll": False,  # @全体成员(在此可设置@特定某人)
        }
    }

    r = session().post(url=url, json=payload, headers=header)
    print(r.json())  # 打印接口请求返回结果


if __name__ == "__main__":
    dataJson = json.load(open('webreport\statistics.json', encoding='gbk'))
    at = dataJson["Total"]
    # transaction = at["transaction"]
    sampleCount = at["sampleCount"]
    errorCount = at["errorCount"]
    errorPct = at["meanResTime"]
    number = os.getenv("BUILD_NUMBER")
    statis = {"number": number, "sum": sampleCount, "fail": errorCount, "ratio": errorPct}
    nail_inform(statis=statis)

备注:jmeter 的消息体的变量来源于 jmeter 自动生成的报告 json 文件中提取的。报告地址是自动将 windows 下生成的报告文件上传到 jenkins 所在的 linux 服务器 tomcat 的 webapps 目录下,这样通过 http 就可以访问了(疑问:要 publish html reporter 插件报错,是因为 windows 与 linux 通过 cp 命令报错原因)
注意:jmeter 需要用高版本的,比如我用的是 5.3 版本,自动生成的报告中有 json 文件

钉钉群消息样式如下:

appiun 对应的 python 脚本

import os

import openpyxl
from requests import session

BASE_DIR = os.path.dirname(os.path.abspath(__file__))


# 读取xlsx文件中数据
def open_xlsx(path, sheet):
    # 打开excel文件,获取工作簿对象
    wb = openpyxl.load_workbook(BASE_DIR + '\\' + path)
    # 通过文件名获得工作表,获取工作表
    table = wb.get_sheet_by_name(sheet)
    return table


def nail_inform(statis):
    """
    :param statis: 测试用例统计 字典 key-sum: 总用例数 key-fail: 失败用例数  key-ratio: 测试通过率
    """

    # 钉钉接口与机器人token
    url = "https://oapi.dingtalk.com/robot/send?" \
          "access_token=af53ebed900ca961cac007983ff1a39d3812e9181ca8d7d84"

    # 头部信息(Content-Type必填)
    header = {
        "Content-Type": "application/json",
        "Charset": "UTF-8"
    }

    msg = "所属项目:  %s\n" \
          "报告地址:  http://....................../jobs/jmeter_ZnbApp/builds/%s/webreport\n" \
          "开始时间:  %s\n" \
          "通    过:  %s\n" \
          "失    败:  %s\n" \
          "错    误:  %s\n" % (
              statis["item"], statis["number"], statis["time"], statis["correct"], statis["error"], statis["fault"])

    payload = {
        "msgtype": "text",
        "text": {
            "content": "自动化测试\n" + msg  # 抓取数据发送的内容放到msg
        },
        "at": {
            "isAtAll": False,  # @全体成员(在此可设置@特定某人)
        }
    }

    r = session().post(url=url, json=payload, headers=header)
    print(r.json())  # 打印接口请求返回结果


def data():
    table = open_xlsx('report.xlsx', 'Sheet1')
    time = table['B2'].value  # 时间
    correct = table['A4'].value  # 通过
    error = table['B4'].value  # 失败
    fault = table['C4'].value  # 错误
    number = os.getenv("BUILD_NUMBER")
    statis = {"item": '智农宝app', "number": str(number), "time": str(time), "correct": str(correct), "error": str(error), "fault": str(fault)}
    print(statis)
    nail_inform(statis=statis)

if __name__ == "__main__":
    data()

备注:appium 的消息体的变量来源于 appium 自动生成的报告 html 文件中提取的。

共收到 2 条回复 时间 点赞

流水账,, 没什么意义

我们公司是创建了一个钉钉群,发布服务的时候会发消息。原理应该是差不多的吧,不是我做的,比较感兴趣,后续可以试着弄一下。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册