Jenkins+Jmeter+ant自动化集成环境搭建

其实此类文档网上有很多,随手百度就是一堆,但别人的不代表就是自己的,所以还是想按实际项目自己再整理一遍属于自己的文档

1.环境准备

1.1Ubuntu 环境配置

1.1.1 服务器配置java环境
jmeter以及ant依赖于java环境,所以需要在运行的服务器搭建java运行环境
1.1.2 jmeter安装与配置
(1)选择安装目录执行下载解压缩即可:wget http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.0.zip
(2)配置环境变量(可选):export PATH=/opt/apache-jmeter-XX/bin/:$PATH export JMETER="/opt/apache-jmeter-XX
(3)环境变量配置后,任意目录下执行 jmeter -v 查看是否配置成功
1.1.3 ant环境配置
(1)安装ant: apt-get install ant
(2)执行 ant -version查看是否安装成功

1.2windows环境配置

1.2.1JDK安装与配置(基本技能)
1.2.2ANT
Apache-ant-XXX
(1)下载后添加环境变量如:ANT_HOME:D:\Progrom Files\apache-ant-1.9.7
(2)系统path添加: %ANT_HOME%\bin
1.2.3Jmeter:下载最新的Binaries版
(1)官网下载后直接解压缩即可使用( Source 是源代码版需手动编译,Binaries是可执行版,解压即可用)
(2)新建系统变量在变量名中输入:JMETER_HOME,内容配置如:D:\Progrom Files\apache-jmeter-5.01
(3)在环境变量Path中添加%JMETER_HOME%\bin
(4)按需插件下载,解压缩后将插件ext文件下的内容拷贝到\apache-jmeter-3.0\lib\ext:https://jmeter-plugins.org/downloads/old/

1.3配置jar包

1.3.1 ant运行jmeter依赖的jar包 复制jmeter的ant jar包到ant目录:cp $JMETER_HOME/extras/ant-jmeter-1.x.x.jar $ANT_HOME/lib/
其实很多人不知道为啥要这么做,似乎是别人都这么说了也就这么做了,其实自己试一下就知道了,如果不复制会报错找不到build中的task

BUILD FAILED
/opt/apache-jmeter-5.0/extras/api_test/database_test/build.xml:96: taskdef class org.programmerplanet.ant.taskdefs.jmeter.JMeterTask cannot be found
using the classloader AntClassLoader[]

1.3.2ant邮件发送依赖的jar包:下载javax.mail-1.X.X.jar到ant/lib/下
1.3.3数据库连接依赖jar包:下载mysql-connector-java-5.1.47-bin.jar 放到jmeter的lib下

2.jmeter配置

2.1jmeter build.xml 配置

其实很多人到这里头就大了,不知道这个文件里面乱七八糟的到底是什么东西,其实很简单,我在这里贴上我实际使用的文件,做了一些备注信息,也许便于理解吧

<?xml version="1.0" encoding="utf-8" ?>
<!--
  Licensed to 巴拉巴拉Apache的一大堆说明直接忽略
-->
<project name="ant-jmeter" default="all">
<description>
<!--这里是jmeter和ant联调方式以及build文件编写方式的基本说明-->
Sample build file for use with ant-jmeter.jar
See http://www.programmerplanet.org/pages/projects/jmeter-ant-task.php
To run a test and create the output report:
ant -Dtest=script
To run a test only:
ant -Dtest=script run
To run report on existing test output
ant -Dtest=script report
The "script" parameter is the name of the script without the .jmx suffix.
Additional options:
-Dshow-data=y - include response data in Failure Details
-Dtestpath=xyz - path to test file(s) (default user.dir).
N.B. Ant interprets relative paths against the build file
-Djmeter.home=.. - path to JMeter home directory (defaults to parent of this build file)
-Dreport.title="My Report" - title for html report (default is 'Load Test Results')
</description>
<!--.........................................自定义分割线 ...................-->
<!--这里是对jmeter各个路径,报告的定义和声明,其实放到一起就是为了整齐一点,当然主要是要在引用之前先声明下-->
<tstamp><format property="time" pattern="yyyyMMddHHmmss"/></tstamp>
<!--定义jmeter的按现目录和根目录(注意:这里默认根目录是build文件所在目录)-->
<property name="basedir" value="/opt/apache-jmeter-5.0/extra" />
<property name="jmeter.home" value="/opt/apache-jmeter-5.0" />
<!-- jmeter生成jtl格式的结果报告的路径,路径具体位置自己定义--> 
<property name="jmeter.result.jtl.dir" value="${basedir}/report/jtl" /> 
<!-- jmeter生成html格式的结果报告的路径--> 
<property name="jmeter.result.html.dir" value="${basedir}/report/html" />
<!-- 定义报告前缀名称,其实就是报告名字的一部分类似于王八蛋的王--> 
<property name="ReportName" value="AATReport"/>
<!-- 定义报告名称 可以加一个时间戳以作区分每次的报告-->
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
<property name="jmeter.result.summaryName" value="${jmeter.result.html.dir}/SummaryReport${time}.html" />
<property name="jmeter.result.detailName" value="${jmeter.result.html.dir}/DetailReport${time}.html" />
<!-- 接收测试报告的邮箱,多个邮箱之间逗号隔开-->
<property name="mail_to" value="Aliaic@xxx.com,Aliaic2@xxx.com"/>
<!-- html报告的页面title-->
<property name="report.title" value="Api AutoTest Results"/>
<!--.................................自定义分割线 ..........................................-->
<!-- <property name="testpath" value="${user.dir}"/>
    <property name="jmeter.home" value="${basedir}/.."/>
    <property name="report.title" value="Load Test Results"/>
    Name of test (without .jmx)
    <property name="test" value="Test"/>
    -->
    <!-- Should report include response data for failures?
这句话的意思是这下面的配置是为了在执行有失败时返回错误数据的 -->
    <property name="show-data" value="n"/>
    <property name="format" value="2.1"/>
    <condition property="style_version" value="_21">
    <equals arg1="${format}" arg2="2.1"/>
    </condition>
    <condition property="funcMode">
    <equals arg1="${show-data}" arg2="y"/>
    </condition>
    <condition property="funcMode" value="false">
    <not>
    <equals arg1="${show-data}" arg2="y"/>
    </not>
    </condition>
    <!-- Allow jar to be picked up locally  这里是加载jmeter ant依赖包的,跟你复制的那个虽然是一个包,但不要混淆以为就可以不复制了-->
    <path id="jmeter.classpath">
    <fileset dir="${basedir}">
    <include name="ant-jmeter*.jar"/>
    </fileset>
    </path>
  <!-- 这里就是定义几个任务了,例如我这里有用例执行任务(run),报告生成任务,邮件发送任务等(sendmail)-->
    <taskdef
    name="jmeter"
    classpathref="jmeter.classpath"
    classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>
    <target name="all">
    <antcall target="run"/>
    <antcall target="xslt-report-summary"/>
    <antcall target="xslt-report-detail"/>
    <antcall target="sendmail"/>
    </target>
<!--定义run任务,指定需要执行的jmx文件-->
    <target name="run">
<jmeter
jmeterhome="${jmeter.home}"
resultlog="${jmeter.result.jtlName}">
    <!-- Force suitable defaults -->
    <testplans dir="${basedir}/testscript" includes="*.jmx" />
    <property name="jmeter.save.saveservice.output_format" value="xml"/>
    <property name="jmeter.save.saveservice.assertion_results" value="all"/>
    <property name="jmeter.save.saveservice.bytes" value="true"/>
    <property name="file_format.testlog" value="${format}"/>
    <property name="jmeter.save.saveservice.response_data.on_error" value="${funcMode}"/>
    </jmeter>
    </target>
    <property name="lib.dir" value="${jmeter.home}/lib"/>
    <!-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ -->
    <path id="xslt.classpath">
    <fileset dir="${lib.dir}" includes="xalan*.jar"/>
    <fileset dir="${lib.dir}" includes="serializer*.jar"/>
    </path>
    <target name="report" depends="xslt-report-summary,copy-images">
    </target>
    <target name="xslt-report-summary" depends="_message_xalan,copy-images">
    <!---->
    <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
    <!--这部分用于将jtl文件转换为.HTML文件
in:生成.jtl文件的路径
out:生成html文件的路径
style:jtl转换成html文件样式:这里对应的style_version是21,即jmeter-results-detail-report_21.xsl
param:style中需要使用的参数
path:添加jar包的路径
-->
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.summaryName}"
style="${basedir}/jmeter-results-report${style_version}.xsl">
<param name="showData" expression="${show-data}"/>
<param name="titleReport" expression="${report.title}"/>
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
</target>
<target name="xslt-report-detail">   
<tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.detailName}"
style="${basedir}/jmeter.results.shanhe.me.xsl">
<param name="showData" expression="${show-data}"/>
</xslt>
</target>
<!-- Copy report images if needed extra文件夹下面有两个图片HTML报告需要,5.0版本复制代码配置好了,直接修改目标目录为jmeter.result.html.dir即可-->
<target name="copy-images" depends="verify-images" unless="samepath">
<copy file="${basedir}/expand.png" tofile="${jmeter.result.html.dir}/expand.png"/>
<copy file="${basedir}/collapse.png" tofile="${jmeter.result.html.dir}/collapse.png"/>
</target>
<target name="verify-images">
<condition property="samepath">
<equals arg1="${jmeter.result.html.dir}" arg2="${basedir}" />
</condition>
</target>
<!-- Check that the xalan libraries are present -->
<condition property="xalan.present">
<and>
<!-- No need to check all jars; just check a few -->
<available classpathref="xslt.classpath" classname="org.apache.xalan.processor.TransformerFactoryImpl"/>
<available classpathref="xslt.classpath" classname="org.apache.xml.serializer.ExtendedContentHandler"/>
</and>
</condition>
<target name="_message_xalan" unless="xalan.present">
<echo>Cannot find all xalan and/or serialiser jars</echo>
<echo>The XSLT formatting may not work correctly.</echo>
<echo>Check you have xalan and serializer jars in ${lib.dir}</echo>
</target>
<!-- 定义邮件发送任务,示例使用的是腾讯企业邮箱配置,邮件正文直接使用了SummaryReport${time}.html报告-->
<target name="sendmail" >
<tstamp><format property="report.datestamp" pattern="yyyy-MM-dd HH:mm"/></tstamp>
<mail mailhost="smtp.exmail.qq.com"
mailport="465"
ssl="true"
user="Aliaic@xxx.com"
password="xxxxx"
subject="${report.datestamp}-接口自动化测试报告"
from="Aliaic@xxx.com"
tolist="${mail_to}">
<message
src = "${jmeter.result.html.dir}/SummaryReport${time}.html" mimetype="text/html">
</message>
<attachments>
<fileset dir="${jmeter.result.html.dir}">
<include name="SummaryReport${time}.html"/>
<include name="DetailReport${time}.html"/>
</fileset>
</attachments>
</mail>
</target>
</project>

2.2jmeter html报告配置

2.2.1html简要报告生成
如我的文件build.xml target="xslt-report-summary”中提到的:style="${basedir}/jmeter-results-report${style_version}.xsl"这里使用的就是jmeter的原生的HTML 风格的报告,类似于我们聚合报告,有一个整体的执行情况以及错误反馈

image.png

2.2.2html详细报告
简要报告只是一个整体执行情况概览,对于需要详情信息是不足够的,所以需要用到detail报告
(1)下载最新的jmeter.results.shanhe.me.xsl到$JMETER_HOME/extras下
(2)进入$JMETER_HOME/bin下修改jmeter.properties:取消需要的配置信息注释并改为true,这样做是为了获取响应的数据或属性

jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
#response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
#Save ResponseData for failed samples
jmeter.save.saveservice.response_data.on_error=false
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
#Only available with HttpClient4
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=false
jmeter.save.saveservice.bytes=true
#Only available with HttpClient4
jmeter.save.saveservice.sent_bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true

报告样式示例


image.png

3.定时任务

目前为止基本环境已经搭建完成了,在build所在路径下执行ant就可以生成报告了,但是我们期望定时执行并且定时清理产生的历史测试报告

3.1定时执行脚本

因为我是在Ubuntu下执行的,所以执行可以建一个定时脚本即可,也可以使用Jenkins构建定时任务,但是那个有些牛刀小用了
关于定时Linux定时脚本的问题,可以后面再聊聊了

3.2定时删除脚本

例如每天的0点0分删除历史文件
0 0 * * * /bin/bash /usr/local/jmeter/extras/report/delete_log.sh

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,681评论 6 517
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,205评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,421评论 0 362
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,114评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,116评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,713评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,170评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,116评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,651评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,714评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,865评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,527评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,211评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,699评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,814评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,299评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,870评论 2 361

推荐阅读更多精彩内容