因项目需要,现学现用,搭建的集成环境,并且根据项目需要做了适当的优化。特整理记录,方便自己,方便他人。。。
软件环境:Jmeter3 + Ant +Jenkins
系统环境:Windows/Linux
部署流程:
- 安装java并设置环境变量
- 安装Jmeter并设置环境变量
- 安装Ant并设置环境变量
- 安装Jenkins
以上安装及设置,自行百度
踩过的坑:
1、Jmeter3只能安装java1.8及以下,不能用java1.9,会导致Jmeter无法启动
Ant配置说明:
- 配置主要文件build.xml
- Ant的执行目录在哪,build.xml就应该在哪;比如
,此时build.xml应该在C:\Users\Administrator\目录下,再如
,此时build.xml应该在c:\Windows\Temp\目录下
- Build.xml详解自行百度,这里只标出我们需要改的地方(有注释的地方)
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<property environment="env" />
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="/usr/local/apache-jmeter-3.1" />
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="./report/jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="./report/html" />
<!-- 生成的报告的前缀-->
<property name="ReportName" value="TestReport" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
<target name="run">
<antcall target="test" />
<antcall target="report" />
</target>
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="." includes="*.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="report">
<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.htmlName}"
style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
Jenkins部署介绍:
- 安装好之后,在浏览器中输入ip:8080即可访问jenkins首页
- 首次访问需要输入默认管理员密码,此密码在Jenkins\secrets\initialAdminPassword文件中
- 初始化插件,选择默认即可
- 创建管理员账号
至此,准备工作已完成
踩过的坑:
- Windows环境下,安装完jenkins后即可直接访问
- Linux环境下,理论上需要安装Tomcat这种web服务器才可正常访问,但我在实际部署过程中发现可以不用安装Tomcat,但是Linux因为权限管制的特别严格,需要注意Jenkins目录的权限问题,否则就会出现无法访问的情况
Jenkins全局系统设置:
1、
此处管理员邮件地址必填,涉及到后期启动发邮件功能
2、
3、
这个好上面的按道理说应该只填一个就行,但是我没有验证。。。所以全都填了,然后在这里可以发测试邮件以此确认邮件系统是否正常
踩过的坑:
1、Jenkins自带的邮件系统按网上的描述,兼容性并不太好,比如我在部署期间,尝试将发送人邮件设置成QQ或者网易,都发送失败,具体原因并未查明,但是换成公司邮箱就正常了
Jenkins全局工具配置:
- JDK设置:
- ANT设置:
3、以上设置仅针对Linux,Windows只要吧环境变量配置好了,这里是不用设置的
通过Jenkins创建新的任务:
1、
2、构建触发器
定时构建的意思就是按照设定的时间或周期来自动构建,时间格式可以点后面的问号了解,大概意思如下:
第一个*表示分钟,取值0~59
第二个*表示小时,取值0~23
第三个*表示一个月的第几天,取值1~31
第四个*表示第几月,取值1~12
第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
每隔5分钟构建一次:H/5 * * * *
每两小时构建一次:H H/2 * * *
每天中午12点定时构建一次:0 12 * * *
每天下午18点定时构建一次:0 18 * * *
3、构建环境
Linux环境这里需要选择之前我们添加的jdk和ant,Windows用默认的default就可以了
4、构建
AnT Version:Linux环境下选择ant,Windows选择default
Targets:应该也可以填,如果填的话应该对应的填写build.xml中<target name="run">里面name对应的值
Build File:填写build.xml所在的位置
执行shell:这些填写要执行的shell脚本
构建后操作:
1.Publish HTML reports
意思就是通过html页面把测试报告展现出来
2.Editable Extended Email Publisher
这里重点就是选择触发通发邮件的条件,比如Failure –any 意思就是构建失败了发邮件,然后sent to就是选择收件人
手动构建,调试配置:
1、
点击这里就是立即构建
2、
构建结果会在构建历史中显示中,调试的时候我们在控制台输出里面分析和排查问题,直至调通
SHELL脚本说明:
- 使用脚本的目的:
因为Jenkins本身机制的原因,jmeter用例执行失败了并不代表任务构建失败,而我们的需求是希望用例执行失败就发邮件,基于此我们用shell脚本来实现我们的需求
- 脚本思路:
因为Jenkins只有在 构建失败的时候才会判断为失败而发邮件,那么我们可以在用例执行完毕之后,插入一个shell脚本先来检索一下测试报告中的结果是否有失败的标识,如果有失败的标识,我们则通过脚本将Jenkins的构建结果直接标记为失败,此时就能触发Jenkins的邮件条件,从而达到我们的目的
- 脚本注释:
#规定此脚本使用/bin/bash来解释执行
#!/bin/bash
#获取当前路径
path=$(pwd)
#将测试报告按时间排序,且取最新报告的文件名,此处” XXX”为文件名中关键字
jtlname=$(ls -lt ./report/jtl|grep XXX|head -n 1|awk '{print $9}')
#拼接成完整的路径值
filepath=$path/report/jtl/$jtlname
#打印一下,方便排查问题
echo $filepath
#在测试报告中判断是否有” <failure>true</failure>”,该字段为用例中断言的结果
grep -c "<failure>true</failure>" $filepath
#IF语句判断上一个结果的真假,为真则表示用例执行失败,exit 1 表示将Jenkins构建结果标识为失败,否则表示用例执行成功,exit 0 表示不干涉Jenkins
if [ $? = 0 ]
then
echo "Failed"
exit 1
else
echo "Success"
exit 0
fi
踩过的坑:
不要在Windows下写好脚本之后再上传到Linux服务器上,因为两个系统对文本格式的处理不一样,会出现各种莫名其妙的问题
以上就是所有内容!因是现学现用,所以不可避免存在理解不了正确的地方,还请大家纠正指出,感激不尽。另外本次因为项目的需要暂时没有用到git或svn代码更新编译的功能,如果以后基于此有新的内容,再来补充!