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

news2024/11/27 10:39:20

上一篇文章中,我们详细介绍了构建 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.coloradmin.cn/o/1599702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底解决 pyshark 库 TShark not found

使用 python 运行 github 某个项目处理 pcap 包时遇到如下报错: (先安装了 pyshark 库) pyshark.tshark.tshark.TSharkNotFoundException: TShark not found. Try adding its location to the configuration file. Searched these paths: […

现在谷歌企业号需要验证企业官网和法人信息,才能注册成功或提审应用?

众所周知,近年来,随着谷歌上架行业的发展,以及开发者们上架马甲包或矩阵式上架的操作,谷歌官方对于开发者账号的审核越来越严格了。 从一开始需要提供收付款卡银行流水账单,到后续引入邓白氏码等更为严格的账号验证机制…

【学习笔记】Vue3源码解析:第四部分- runtime-dom(1)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码) 第四部分-:(对应课程的第24-26节) 第24节:《理解runtime-dom的作用》 源码中除了 dep.ts ,其余基…

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…

边缘计算网关主要有哪些功能?-天拓四方

随着物联网(IoT)的快速发展和普及,边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备,边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏:http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter,迪米特法则)。尽LoD不像SOLID、KI…

面试:lock 和 synchronized

一、语法层面 synchronized 是关键字,源码在jvm中,用c语言实现Lock 是接口,源码由jdk提供,用java语言实现使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法…

Linux中进程和计划任务

一.程序 1.什么是程序 (1)是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具 (2)用于描述进程要完成的功能,是控制进程执行的指令集 二.进程 1.什么是进程…

量化过程信息损耗分析(MATLAB)

MATLAB代码 clear_all; Mrand(5,5)*100;% 假设M是待转换的矩阵 a min(M(:)); b max(M(:));% 将M映射到[0, 255] M_mapped functionA(M, a, b); M_mapped_floorfloor(M_mapped); % 将M_mapped恢复到原始范围 M_original functionB(M_mapped_floor, a, b);disp(M); disp(M_m…

【吊打面试官系列】Java高并发篇 - 什么是多线程中的上下文切换?

大家好,我是锋哥。今天分享关于 【什么是多线程中的上下文切换?】面试题,希望对大家有帮助; 什么是多线程中的上下文切换? 在上下文切换过程中,CPU 会停止处理当前运行的程序,并保存当前程序运行…

【Altium Designer 20 笔记】PCB铺铜过程

PCB铺铜步骤 切换到Keep-Out Layer(禁止布线层) 使用shifts键切换单层显示 画禁止布线范围(防止铺铜过大) 切换到需要铺铜的层 选择铺铜网络,通常是地(GND)或某个电源网络 隐藏覆铜:…

为什么说linux操作系统要比windows稳定?

正常人说windows的时候是指一整套桌面系统,而说linux的时候是一个命令行内核。后者从原理上就比前者稳定。 如果你日常使用的是linux的发行版桌面系统,看到这话估计直接想骂娘。就我12年的ubuntu使用体验来说,定期备份系统是必须的&#xff…

MySQL DDL 通用语法

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

NIO学习

文章目录 前言一、主要模块二、使用步骤1.服务器端2.客户端 三、NIO零拷贝(推荐)四、NIO另一种copy总结 前言 NIO是JDK1.4版本带来的功能,区别于以往的BIO编程,同步非阻塞极大的节省资源开销,避免了线程切换和上下文切换带来的资源浪费。 一、主要模块 Selector&a…

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀,更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况: 简单⼯⼚模式包括三个主要⻆⾊…

【STL详解 —— priority_queue的使用与模拟实现】

STL详解 —— priority_queue的使用与模拟实现 priority_queue的使用priority_queue的介绍priority_queue的定义方式priority_queue各个接口的使用 priority_queue的模拟实现仿函数priority_queue的模拟实现 priority_queue的使用 priority_queue的介绍 std::priority_queue 是…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示,帮助决策层更好地了解销售情况和趋势,进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

专项1:理论横向误差计算

1.前言 车辆实际位置与轨迹要求的位置的误差大小是反映自动驾驶控制精度的关键性指标,也是作为控制系统的输入量。在对车辆的控制算法进行研究时候,首先需要厘清控制系统的输入。控制系统的输入的关键性环节就是笛卡尔坐标系和frent坐标系之间的转换。 …

【进阶篇】四、字节码增强框架:ASM、ByteBuddy

文章目录 1、ASM2、ASM字节码增强3、ASM入门案例4、ASM Java Agent实现增强类的方法5、Byte Buddy6、Byte Buddy案例 相比自己的代码里用Spring AOP添加某些功能,字节码增强更适配无侵入式的Java Agent场景。比如下面写个Java Agent打印 任意Java程序中方法执行的…

电商技术揭秘九:搜索引擎中的SEO数据分析与效果评估

相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台的个性…