Jenkins+JMeter实现自动化,性能压测玩转CICD!

news2024/11/23 7:29:34

目录

 前言:

准备工作

 编写Jenkinsfile

编写JMeter脚本

 编写 Dockerfile

 总结


 前言:

性能压测是应用程序开发中不可或缺的一环。它通过模拟应用程序在真实环境下的负载情况,从而检测系统在高负载下的性能表现。而随着依托云架构部署业务的不断普及,如何结合自动化测试来实现应用程序的持续集成和持续部署已成为关注的重点。

本文将介绍如何利用 Jenkins 来实现性能压测的持续集成和持续部署。

准备工作

在开始之前,需要确保您已经安装了以下工具:

1. Jenkins和Plugins:这些是用于实现CI/CD的必要工具。可以从官网上安装Jenkins并安装相应插件。这里我们需要安装下列插件:

- Performance Plugin: 这个插件用来处理性能测试相关的结果。
- Pipeline Plugin: 这个插件将使我们能够构建一个流水线任务包含多个步骤的工作流。

2. JMeter: 这个软件是用于性能测试的最流行工具之一。

3. Git: 这个工具实现代码版本控制。

4. Docker: 这个工具用于构建和运行容器。

 编写Jenkinsfile

接下来,我们需要编写一个Jenkinsfile来实现CICD持续集成和持续部署。 

pipeline {
    environment {
        DOCKER_REGISTRY = "mydockerregistry.com"
        DOCKER_IMAGE = "myimage:${BUILD_NUMBER}"
        REPO_NAME = "MyRepo"
        REPO_URL = "https://github.com/MyRepo.git"
        JMETER_HOME = "/usr/share/jmeter"
    }
    agent any

    stages {
        stage('Clone') {
            steps {
                git url: "${REPO_URL}"
            }
        }

        stage('Build') {
            steps {
                sh '''
                    docker build -t ${DOCKER_REGISTRY}/${DOCKER_IMAGE} .
                    docker push ${DOCKER_REGISTRY}/${DOCKER_IMAGE} 
                '''
            }
        }

        stage('Functional Tests') {
            steps {
                sh '''
                    docker run --rm ${DOCKER_REGISTRY}/${DOCKER_IMAGE} /bin/sh -c "npm run functional-tests"
                '''
            }
        }

        stage('Performance Tests') {
            steps {
                sh '''
                    docker run --rm -v $(pwd)/jmeter:/jmeter ${DOCKER_REGISTRY}/${DOCKER_IMAGE} /bin/sh -c "jmeter -n -t /jmeter/myTest.jmx -l /jmeter/myTest.jtl"
                '''
                perfReport percentiles: '0,50,90,100', reportFiles: 'jmeter/myTest.jtl'
            }
        }

        stage('Deploy') {
            steps {
                sh '''
                    helm upgrade --install myApp ./myApp --set image.tag=${BUILD_NUMBER}
                '''
            }
        }
    }
}

上述代码描述了一个完整的流程来实现一个CICD的流水线。其中包括了从Git仓库中获取代码、构建镜像、运行性能测试、持续部署等各个步骤。

我们需要将以上代码保存到Git仓库中,然后在Jenkins中创建一个新的流水线任务。并将Git仓库的地址配置在“Pipeline”中。

编写JMeter脚本

本例中使用JMeter来模拟并发请求,测试应用程序的性能和稳定性。需要创建一个包含以下元素的JMeter测试脚本:

1. `Thread Group` 元素:定义并发用户数、请求数等属性。

2. `HTTP Request` 元素:测试应用程序的API的响应时间。在这个元素中指定url,请求方法和参数。

3. `Aggregate Report` 监听器:提供关于测试结果的策略性的信息,如响应时间和错误率。

以下是完整的JMeter测试脚本示例:

(以上是JMeter测试脚本的部分,以下是完整的JMeter测试脚本示例:)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="1.0">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">1</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
        <longProp name="ThreadGroup.start_time">1461746819000</longProp>
        <longProp name="ThreadGroup.end_time">1461746825000</longProp>
        <intProp name="ThreadGroup.num_threads">50</intProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
          <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="HTTPSampler.domain">example.com</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
          <stringProp name="HTTPSampler.protocol">https</stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path">/api/resource</stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <boolProp name="HTTPSampler.monitor">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
          <boolProp name="HTTPSampler.use_md5">false</boolProp>
          <boolProp name="HTTPSampler.preemptiveAuth">true</boolProp>
          <stringProp name="HTTPSampler.browser_compatible_multipart">true</stringProp>
          <stringProp name="HTTPSampler.path_extension"></stringProp>
        </HTTPSamplerProxy>
        <hashTree>
          <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Aggregate Report" enabled="true">
            <boolProp name="ResultCollector.error_logging">false</boolProp>
            <objProp>
              <name>saveConfig</name>
              <value class="SampleSaveConfiguration">
                <time>true</time>
                <latency>true</latency>
                <timestampFormat>yyyy/MM/dd HH:mm:ss</timestampFormat>
                <success>true</success>
                <assertions>true</assertions>
                <threadName>true</threadName>
                <milliseconds>true</milliseconds>
                <idleTime>true</idleTime>
                <format>csv</format>
                <testNameColon>false</testNameColon>
                <omitVariableNames>true</omitVariableNames>
              </value>
            </objProp>
            </ResultCollector>
          <hashTree/>
          </hashTree>
          </hashTree>
          </hashTree>
          </jmeterTestPlan>

在编写完整 JMeter 脚本后,将其保存为 myTest.jmx 并上传到 Git 仓库。

 编写 Dockerfile

接下来,我们需要在 Docker 中运行 JMeter,并使用测试脚本运行性能测试。为此,我们需要创建一个能够运行 JMeter 的 Docker 镜像。

以下是完整的 Dockerfile 示例:

FROM openjdk:8u201-jdk-alpine

ENV JMETER_VERSION 5.4.1

RUN mkdir /jmeter \
    && apk --update add --no-cache wget ca-certificates \
    && cd /jmeter \
    && wget http://mirror.reverse.net/pub/apache/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz \
    && tar -xzf apache-jmeter-${JMETER_VERSION}.tgz \
    && rm apache-jmeter-${JMETER_VERSION}.tgz \
    && apk del wget \
    && rm -rf /var/cache/apk/*

ENV PATH $PATH:/jmeter/apache-jmeter-${JMETER_VERSION}/bin

VOLUME /jmeter

WORKDIR /jmeter

我们需要将以上 Dockerfile 保存到本地,并利用 docker build 命令创建一个容器镜像。然后,可以使用这个容器镜像运行 JMeter,在容器中执行性能测试。

 总结

在本文中,我们介绍了一种使用 Jenkins 和 JMeter 实现性能压测的持续集成和持续部署的方法。我们创建了一个 Jenkinsfile 来描述持续集成和持续部署的流程,并使用了 JMeter 来测试应用程序的性能。最后,我们还创建了一个 Dockerfile 来构建 JMeter 的 Docker 镜像,从而方便地在容器中运行性能测试。这种方法不仅提高了应用程序的性能和稳定性,还可以提高开发效率和团队的协作能力。

  作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些性能测试前进之路的必须品,如果你用得到的话可以直接拿走,希望能对你带来帮助。(性能测试,大厂面试真题、简历模板等等),相信能使你更好的进步!

获取方式:留【性能测试】即可【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N4P3http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=aHIGBYHUghap5i_4GNUt5dSxrYN_BA3m&authKey=9rU8HTM3ZRVPSeuHVBKHFTEvsTYxn1bDFX9YLoUPJdvXKIPtlRv%2FcKMe0gjD6uHR&noverify=0&group_code=574737577

 

 

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

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

相关文章

2022年长三角高校数学建模竞赛B题齿轮箱故障诊断解题全过程文档及程序

2022年长三角高校数学建模竞赛 B题 齿轮箱故障诊断 原题再现&#xff1a; 齿轮箱是用于增加输出扭矩或改变电机速度的机械装置&#xff0c;被广泛应用于如汽车、输送机、风机等机械设备中。它由两个或多个齿轮组成&#xff0c;其中一个齿轮由电机驱动。电机的轴连接到齿轮箱的…

大数据 Ranger2.1.0 适配 Kafka3.4.0

Ranger2.1.0 适配 Kafka3.4.0 官方说明POM代码说明 根据官方说明Kafka3.0以上版本将会被替换权限认证方式&#xff0c;包括 类和方法 的变换&#xff0c;所以需要对ranger中继承 kafka 的实现中&#xff0c;修改相应的逻辑 官方说明 Kafka3.0以上版本将会被替换权限认证方式&a…

vue项目瘦身

如图 项目中node_modules包已占用十几G&#xff0c;我也是发现我的磁盘空间缩小的超级快&#xff0c;因为好几个项目&#xff0c;甚至有的项目包已经占了50多G&#xff0c;这都得益于上一个刚走了的laji npm install -g depcheck 一旦安装了depCheck&#xff0c;您可以在命令行…

通过 Github workflows CI/CD 自动化部署 Github Pages hugo 免费博客

通过 Github workflows CI/CD 自动化部署 Github Pages hugo 免费博客 文章博客地址&#xff1a;https://blog.taoluyuan.com/posts/github-workflows/ Github Workflows 介绍 GitHub Actions 介绍 GitHub 文档&#xff1a;https://docs.github.com/zh/actions/learn-githu…

相机的畸变矫正与opencv代码说明

相机的畸变矫正与opencv代码说明 简介鱼眼模型的畸变校正针孔模型的畸变校正 简介 图像算法中会经常用到摄像机的畸变校正&#xff0c;有必要总结分析OpenCV中畸变校正方法&#xff0c;其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法。普通相机模型畸变校正函…

机器人专业讲师与科技的转型思考

2023年以前&#xff0c;编程需要学习各种语法&#xff0c;现在只需要提示词。 未来还需要编程老师吗&#xff1f;需求一定越来越少。 “ Prompting TurtleSim from ChatGPT ” https://github.com/mhubii/chatgpt_turtlesim The demo lets ChatGPT call into ROS services …

左孩子右兄弟路径之谜

题目 对于一棵多叉树&#xff0c;我们可以通过 “左孩子右兄弟” 表示法&#xff0c;将其转化成一棵二叉树。 如果我们认为每个结点的子结点是无序的&#xff0c;那么得到的二叉树可能不唯一。 换句话说&#xff0c;每个结点可以选任意子结点作为左孩子&#xff0c;并按任意顺序…

开源版社区团购系统源码 含小程序完整前后端+搭建教程+私有化部署

分享一个社区团购系统源码&#xff0c;源码开源可自由二开&#xff0c;含小程序完整前后端和详细的搭建教程&#xff0c;可私有化部署终身使用&#xff0c;功能界面diy团长供应商拼团秒杀优惠券菜谱积分群接龙充值预售配送等功能。 系统功能一览&#xff1a; 1、商品&#xf…

企业级应用:检测服务是否正常运行

1.说明&#xff1a; 在公司日常小项目中&#xff0c;会遇到一些小需求&#xff0c;比如&#xff1a;检测服务是否正常运行。 当一个经验不是很足的项目经理&#xff0c;让你写一个接口&#xff0c;然后检测服务是否正常运行啦。 然后你说阿里云有自动检测的接口&#xff0c;…

一文说明ROS中URDF和SRDF分别是什么

文章目录 前言一、功能作用说明URDFSRDF 二、样例文件说明URDF文件例子SRDF文件例子 总结 前言 URDF全称为Unified Robot Description Format&#xff0c;中文可以翻译为“统一机器人描述格式”。与计算机文件中的.txt文本格式、.jpg图像格式等类似&#xff0c;URDF是一种基于…

浅谈TCP IP协议(二)IP地址

上一节大致了解TCP/IP协议栈是个啥东西&#xff0c;依旧是雾里看花的状态&#xff0c;有很多时候学一门新知识时&#xff0c;开头总是很急躁&#xff0c;无从下手&#xff0c;刚学会一点儿&#xff0c;却发现连点皮毛都不算&#xff0c;成就感太低&#xff0c;所以任何时候学习…

JavaScript 中的 Window.open() 用法详解

文章目录 1 方法介绍2 参数说明3 使用示例3.1 当前窗口中打开网页3.2 新窗口中打开网页3.3 在独立窗口中打开一个指定大小和位置的网页 1 方法介绍 window.open() 方法是 JavaScript 中的一个内置方法&#xff0c;用于在浏览器中打开一个新的窗口或标签页。 这个方法的语法是…

《五》 Git 中的标签和分支

标签 tag&#xff1a; Git 可以给仓库中某一次 commit 的提交打上标签。对于重大的版本经常会打上一个标签来表示它的重要性。 创建标签&#xff1a; git tag【tag 名称】&#xff1a;创建标签。 查看标签&#xff1a; git tag&#xff1a;查看标签。 推送标签到远程仓库…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月30日论文合集)

文章目录 一、检测相关(16篇)1.1 Contextual Object Detection with Multimodal Large Language Models1.2 Towards minimizing efforts for Morphing Attacks -- Deep embeddings for morphing pair selection and improved Morphing Attack Detection1.3 Mining Negative Tem…

Pytorch CIFAR10图像分类 ShuffleNet篇

Pytorch CIFAR10图像分类 ShuffleNet篇 文章目录 Pytorch CIFAR10图像分类 ShuffleNet篇4. 定义网络&#xff08;ShuffleNet&#xff09;Channel Shuffle网络单元 Shuffle UnitShuffleNet 网络结构summary查看网络测试和定义网络 5. 定义损失函数和优化器6. 训练及可视化&#…

「教程」微信小程序获取经纬度查询天气预警信息

使用天气预警API 可以帮助人们及时获取和了解天气预警信息&#xff0c;以便采取相应的措施来保护自身和财产。天气预警通常是由气象部门或相关机构发布的&#xff0c;用于提醒公众可能出现的极端天气或自然灾害&#xff0c;如暴雨、洪水、台风、暴风雪、雷暴、高温、低温、霜冻…

LNMT架构之LNMT与nginx动静分离

LNMT架构之LNMT与nginx动静分离 目录 一、实验前提环境配置 &#xff08;一&#xff09;关闭防火墙&#xff0c;安装本地yum &#xff08;二&#xff09;部署tomcat &#xff08;三&#xff09;部署Mariadb &#xff08;四&#xff09;部署nginx 二、动静分离 步骤一&a…

Django实现接口自动化平台(二)认证授权【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;一&#xff09;日志功能【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、认证与授权配置 1、认证&#xff1a;获取权限的方式 2、授权&#xff1a;通过认证之后&#xff0c;可以获取哪些权限 …

【大数据分析】Hbase的基本原理

目录 Hbase 架构ClientZooKeeperMasterRegionServerHRegionStoreMemStoreStoreFileHFileHLog Hbase数据模型关于数据模型的其他概念Name SpaceTableRowColumnTime StampCell Hbase 架构 Client &#xff08;1&#xff09;.META.表&#xff0c;记录了用户所有表拆分出来的 Regi…

ESP32设备驱动-TMP006 红外热电堆传感器驱动

TMP006 红外热电堆传感器驱动 文章目录 TMP006 红外热电堆传感器驱动1、TMP006介绍2、硬件准备3、软件准备4、驱动实现1、TMP006介绍 Texas Instruments 的 TMP006 是一系列温度传感器中的第一款,无需接触物体即可测量物体的温度。 它使用非常灵敏的热电堆来测量从物体表面发…