目录
前言:
准备工作
编写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)http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=aHIGBYHUghap5i_4GNUt5dSxrYN_BA3m&authKey=9rU8HTM3ZRVPSeuHVBKHFTEvsTYxn1bDFX9YLoUPJdvXKIPtlRv%2FcKMe0gjD6uHR&noverify=0&group_code=574737577