测试项目:若依管理平台
架构选型1:jenkins+ant+jmeter
阐述:
jenkins配置node和item
node负责jenkins和远程机器的配对以实现定时任务
item为jenkins的job配置,包括定时、git拉取和运行结果校验以及触发一些邮件企微钉钉之类的通知,当然最核心功能:触发ant脚本的执行
ant的build.xml编写有不同的target,每个target可以理解为一个任务,按顺序执行,target可以包含执行jmeter脚本,生成jmeter报告,打压缩包和发送邮件等一系列操作
jmeter脚本编写接口自动化的case,可以配置一些数据驱动(用户自定义的变量,csv,mysql等),做一些响应断言和一些关联操作(json和正则提取器)包括一些函数助手啊,beanshell等的使用以丰富测试手法。
任务分解:
1.jenkins关联slave机和gitee仓库(保证代码拉取并推到slave上)
2.slave机部署ant和jmeter环境(保证脚本运行)
3.ant的build.xml和jmeter脚本编写并上传gitee(保证脚本的迭代优化)
4.jenkins配置定时任务,编写命令行脚本移动build.xml到ant目录并使用ant命令执行(保证使用最新的build.xml运行任务)
实际任务执行顺序应该是3-4-1-2-3-3-3……即:先把脚本上传gitee,jenkins定时去拉取推到slave上执行,后续不断迭代和优化。
架构选型2:jenkins+python+pytest(主流方案,较灵活)
阐述:
此方案与前者的区别就是把ant+jmeter发挥的作用使用Python脚本替代,并选用pytest封装并运行case,相较前者更灵活,不受工具的限制,但是项目代码的封装需要一定的技术成本,如何做到项目结构清晰合理,脚本运行高效且代码量简洁易维护应当作为我们不断追求的目标。
下面针对方案2作详细说明,如有疏漏或者您有疑问或更优解,也欢迎评论或私信,与您的交流将是推动我持续更文的极大动力。
一、jenkins搭建
1.jenkins配置slave代理
附上官网安装步骤
需注意:默认端口8080常用,请避免端口冲突
安装之后打开,输入密匙进入
新建从节点,即node,只需填写名称、workspace路径、标签(用于job指定node来运行使用)和启动方式(我们选java web方式)即可

保存之后会显示从节点的代理连接方式

需要在从节点机器上保存agent.jar,执行下方的java -jar命令即可
可能会报错,踩坑如下:

查了下大概原因是代理端口不能和jenkins端口一样,端口冲突需要改一下【系统管理】-【全局安全配置】下的代理端口即可

再次执行,最后一行显示Connected即为成功

此时刷新节点列表的状态,等图标的红叉消失即为成功(可能会有一定的延迟)

2.jenkins新建item关联slave和gitee
由于网络原因,我们选择gitee进行代码管理
新建一个jenkins的item也就是job用来构建任务,添加指定运行的slave对应的label

添加源码管理,这里选用https形式,添加凭据,输入gitee的用户名和密码即可(如使用ssh形式好像是需要配置密匙,回头可以了解一下)


注意,如果是私有仓库会拉取失败,建议改用公开仓库配置。
添加定时任务
比如每天凌晨1点执行

执行命令,因为我们选用了pytest,可以直接pytest(注意:根据slave机器的类型添加构建步骤,笔者选用的是Windows机器,故选择Windows批处理)

至此,jenkins定时触发代码拉取并执行脚本流程完成。
二、脚本编写并上传gitee
1.项目结构
待补充
2.封装通用方法
待补充
| 功能 | 方法 | 库 |
|---|---|---|
| 测试数据存储 | 读取数据 | PYaml |
| 接口请求 | get/post | requests |
3.运行入口
选用pytest,pytest.ini配置参数
4.git hook
特定场景下触发hook脚本(如:每次commit 、push之后,远程服务器同步最新代码)
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import subprocess
import os
class Resquest(BaseHTTPRequestHandler):
def handler(self):
print("data:", self.rfile.readline().decode())
self.wfile.write(self.rfile.readline())
def do_POST(self):
print("hello webhook..")
os.system('cd ./project/pear-admin-flask && git add . && git status && git stash ;git stash clear;git pull')
print("git pull finished")
if __name__ == '__main__':
host = ('', 9002)
server = HTTPServer(host, Resquest)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()