基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中,我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤,并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能,将构建好的镜像利用在自动化测试作业中。在今天的文章中,我们将重点讨论如何构建 JMeter 的 Docker 镜像,并演示如何在 GitLab 的 CI/CD 作业中利用该镜像进行自动化压力测试。

测试接口

测试接口依旧采用上篇文章使用的接口,详见https://blog.csdn.net/jiajw0426/article/details/137612529

使用如下命令生成测试数据,为了演示我们会把脚本卸载执行自动化测试之前

curl -X POST -H "Content-Type: application/json" \
  -d '{"name": "John", "age": 30}' \
   http://192.168.3.52:9999/users

使用如下命令检查数据是否生成成功

curl http://192.168.3.52:9999/users

构建JmeterDocker镜像

如果可以上网可以通过命令从网上下载Jmeter

wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.3.tgz

我们基于 OpenJDK 17 镜像构建,设定工作目录为 /jmeter,然后从本地复制 JMeter 的压缩包至工作目录,并解压。接着,将 JMeter 的 bin 目录添加至 PATH 环境变量中。你也可以选择复制自定义的 JMeter 配置文件到相应目录。最后,可选地指定了默认的启动命令为 jmeter。

# 使用 JDK 镜像作为基础镜像
FROM openjdk:17

# 设置工作目录
WORKDIR /jmeter

#  本地复制JMeter
COPY apache-jmeter-5.6.3.tgz /jmeter/
RUN  tar -xzf apache-jmeter-5.6.3.tgz && \
    rm apache-jmeter-5.6.3.tgz

# 将 JMeter 的 bin 目录添加到 PATH
ENV PATH="/jmeter/apache-jmeter-5.6.3/bin:${PATH}"

# 复制自定义的 JMeter 配置文件(如果有的话)
# COPY jmeter.properties /jmeter/apache-jmeter-5.6.3/bin/jmeter.properties

# 指定默认的启动命令(可选)
# CMD ["jmeter"]

使用如下命令构建Docker镜像

docker build -t docker.mvcode.cn:8083/jmeter:5.6.3

然后使用命令上传到镜像库

docker push docker.mvcode.cn:8083/jmeter:5.6.3

请添加图片描述

然后使用如下命令测试Jmeter命令是否可以正常使用

docker run --rm docker.mvcode.cn:8083/jmeter:5.6.3 jmeter -v

请添加图片描述

编写测试用例

测试用例非常简单,就是多线程并发请求用户查询接口,验证查询结果返回结果是否正确。我们使用Jmeter工具编写测试用例。

设置环境变量

这里定义了一些用户变量,包括主机名(Host)、端口号(Port)、线程数(ThreadCount)和循环次数(LoopCount)。为了在后续的测试中灵活地修改,通过${__P(name,default)}方式从系统变量中获取,在Jemter中执行就使用默认值。既满足编写测试用例,有方便自动执行。
请添加图片描述

定义线程组

在这个测试用例中,线程数由之前定义的 ThreadCount 变量控制,每个线程将循环执行指定LoopCount 次数的请求。

请添加图片描述

用户查询请求

请添加图片描述

JSON断言

使用$.[?(@.name == 'John' && @.age == 30)]对结果进行断言。

请添加图片描述

本地执行测试

执行测试成功可以导出到文件。
请添加图片描述

请添加图片描述

定义Gitlab Job

将导出文件jmeter.jmx上传到testcases目录、
请添加图片描述

修改测试脚本

请添加图片描述

修改test.js脚本,如上图所示。首先添加如下内容,通过我们构建的devtools镜像,添加用于测试的数据。devtools镜像的构建步骤参照基于Docker构建CI/CD工具链(一)构建基础工具镜像

docker run --rm \
   docker.mvcode.cn:8083/devtools:1.0.0 \
   curl -X POST -H "Content-Type: application/json" \
  -d '{"name": "John", "age": 30}' \
   http://192.168.3.52:9999/users

添加执行Jmeter测试用的脚本如下

docker run --rm -v ${APP_ROOT}:/app -w /app \
   docker.mvcode.cn:8083/jmeter:5.6.3 jmeter \
   -n -j /app/test_jmeter.log \
   -l /app/replort_jmeter.log \
   -o /app/report \
   -JServerHost=192.168.3.52 \
   -JServerPort=9999 \ 
   -JThreadCount=5 \
   -t ./testcases/jmeter.jmx -e -f

这是一个 Docker 命令,用于在容器中运行 JMeter 测试。以下是命令的各部分解释:

  • docker run: 运行 Docker 容器的命令。
  • --rm: 在容器停止后自动删除容器,确保容器退出后不会留下残留文件。
  • -v ${APP_ROOT}:/app: 将本地 ${APP_ROOT} 目录(宿主机上的目录)挂载到容器内的 /app 目录,实现文件的共享和数据持久化。
  • -w /app: 指定容器的工作目录为 /app,即在容器内运行命令时的默认工作目录为 /app
  • docker.mvcode.cn:8083/jmeter:5.6.3: 指定要运行的 Docker 镜像的名称和版本,这里是 JMeter 版本为 5.6.3 的镜像,来自 docker.mvcode.cn:8083 仓库。
  • jmeter: 要在容器中执行的命令,这里是运行 JMeter。
  • -n: 非 GUI 模式运行 JMeter。
  • -j /app/test_jmeter.log: 指定 JMeter 的日志文件路径。
  • -l /app/replort_jmeter.log: 指定测试结果的日志文件路径。
  • -o /app/report: 指定生成 HTML 报告的目录。
  • -JServerHost=192.168.3.52: 设置 JMeter 测试时使用的服务器主机地址。
  • -JServerPort=9999: 设置 JMeter 测试时使用的服务器端口。
  • -JThreadCount=5: 设置 JMeter 测试时的线程数。你可以设置LoopCount设置循环次数。
  • -t ./testcases/jmeter.jmx: 指定要运行的 JMeter 测试计划文件的路径。
  • -e: 生成 JMeter 测试报告时包括所有样本数据。
  • -f: 在生成 JMeter 测试报告时强制覆盖已存在的报告文件。

综上所述,该命令的作用是在 Docker 容器中运行 JMeter 测试,并生成相应的日志文件和测试报告。其他参数可以参照JMeter官方文档。

执行CI/CD JOB

请添加图片描述

执行测试完成后,你在宿主机上可以看到生成测试报告。如何收集测试报告我们会通过一篇专门的文章讲述。
请添加图片描述

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/549295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高通平台】如何升级蓝牙的firmware

1. 您可以使用以下命令升级固件 adb push apbtfw11.tlv /bt_firmware/image/ adb push apnv11.bin /bt_firmware/image/ adb shell sync 或者 adb push crbtfw21.tlv /vendor/bt_firmware/image adb push crnv21.bin /vendor/bt_firmware/image adb shell sync 查看代码路径…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…

Linux学习(1)

参考学习韩顺平老师 第一章:LINUX 开山篇-内容介绍 1.2.Linux 使用在那些地方 linux运营工程师主要做: 服务器规划 调试优化 对系统进行日常监控 故障处理 对数据的备份和处理 日志的分析 1.3.Linux 的应用领域 1.个人桌面领域的应用 …

短视频底层逻辑分析

短视频底层逻辑 1.迭代模型_ev 2.Douyin的本质_ev 3.Douyin的审核机制_ev 4.平台趋势_ev 5.定位_ev 6.建立用户期待_ev 7.好内容的定义_ev 8怎么做好内容_ev 9.如何做好选题_ev 10.如何快速模仿_ev 11.账号拆解的底层逻辑_ev 12选人的重要性_ev 13.内容的包装_ev 14.打造大IP的…

easyexcel升级3.3.4失败的经历

原本想通过easyexcel从2.2.6升级到3.3.3解决一部分问题,结果之前的可以用的代码,却无端的出现bug 1 Sheet index (1) is out of range (0…0) 什么都没有改,就出了问题,那么问题肯定出现在easyexcel版本自身.使用模板填充的方式进…

Innodb之redo日志

Innodb引擎执行流程 redo log ​ MySQL中的redo log(重做日志)是实现WAL(预写式日志)技术的关键组件,用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事,…

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

【云原生数据库:原理与实践】1- 数据库发展历程

1-数据库发展历程 1.1 数据库发展概述 从1960年&#xff1a;Integrated Database System&#xff08;IDS&#xff09;&#xff0c;该系统是一个网状模型&#xff08;Network Model&#xff09;到 IMS&#xff08;Information Management System&#xff09;&#xff0c;使用了…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Zhang等人受到自然界鸭群觅食行为启发&#xff0c;提出了鸭群算法&#xff08;Duck Swarm Algorithm, DSA&#xff09;。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

[leetcode] max-area-of-island

. - 力扣&#xff08;LeetCode&#xff09; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&…

基于SpringBoot+Vue的共享汽车管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足&#xff0c;创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理…

从 MySQL 到 DynamoDB,Canva 如何应对每天新增的 5000 万素材

作为一款设计工具&#xff0c;Canva 吸引人的一个重要特色就是拥有数以亿计的照片和图形资源&#xff0c;支持用户上传个人素材。 Canva 于 2013 年推出&#xff0c;设立了一个包含大量照片和图形的资源库&#xff0c;并允许用户上传自己的素材以用于设计。从发布之日起&#…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出&#xff0c;又称PR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性&#xff0c;优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想&#xff1a; 数量假设&#…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

typescript中的type关键字和interface关键字区别

Type又叫类型别名&#xff08;type alias&#xff09;,作用是给一个类型起一个新名字&#xff0c;不仅支持interface定义的对象结构&#xff0c;还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。 type num number; // 基本类型 type stringOrNum string |…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果&#xff0c;共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

BLE架构图

PHY层(Physical layer 物理层) PHY层用来指定BLE所用的无线频段(2.4G)&#xff0c;调制解调方式和方法、跳频等。PHY层的性能直接决定整个BLE芯片的功耗、灵敏度以及selectivity等射频指标。 LL层(Link Layer 链路层) 链路层主要是对RF射频控制。链路层定义了协议栈中最为基础的…

C++解决大学课设所有管理系统(增删查改)

C一篇解决大学课设所有**管理系统(增删查改) 文章目录 C一篇解决大学课设所有**管理系统(增删查改)1.引言1.1 使用结果展示 2. 基本原理3. 文件层次结构4.具体实现(通讯录管理系统为例)4.1 通讯录实体类(addressbook.h)4.2 通讯录实现类(addressbook.cpp)4.3 通讯录管理类&…
最新文章