利用Jenkins+ant+jmeter实现日常工作接口自动化持续集成。

所有环境依赖JDK,所以第一步我们必须先安装配置好JDK环境。JDK下载安装配置教程

然后我们开始正式搭建:

1.搭建jmeter环境:我本地上已经搭建好,如果不会的可以自行百度一下jmeter的安装教程。有很多,讲解的也很清晰明了。jmeter的下载地址

2.搭建ant环境:Ant和maven类似,maven是执行pom文件,ant是执行build文件。点击下载ant

解压

3.配置ant环境变量:参考百度,这里环境不是重点,不细解,进入命令行模式输入ant -version能够显示版本号说明配置成功

 4.搭建Jenkins环境,点击下载jenkins.war

 注:这里需要注意一下,Jenkins第一可以依赖容器Tomcat,也可以依赖自带的 Jetty 服务器独立运行。第一种方法:如果您电脑上有配置好的Tomcat环境,将下载的jenkins.war拷贝到apache-tomcat-8.0.28\的webapps目录下,然后进入到Tomcat的bin目录下,点击startup.bat启动Tomcat。在浏览器中输入http://127.0.0.1:8080/jenkins访问。如果端口号被占用,可以通过修改Tomcat的端口号来实现。这里不细讲,有不懂的可以留言或者添加QQ群、微信。第二种方法:我电脑上有Tomcat,但是我这里为了教大家最简单的方法,我说一下第二种。直接使用命令启动。Win+R运行进入cmd模式,cd进入到jenkins.war目录,输入命令java -jar jenkins.war --httpPort=8888,8888可以改成一个没有被占用的你想用的端口号。然后在浏览器中输入http://127.0.0.1:8888进行访问。

5.使用jmeter创建一个测试脚本test01.jmx,具体步骤如下:

①进入jmeter安装目录,例如D:\JMeter\apache-jmeter-5.1.1\下的bin目录下,然后找到jmeter.bat启动jmeter,然后添加线程用户-线程组

②右键线程组,添加取样器-http请求

③http中我们随便写点,比如就写请求百度

④添加察看结果树

⑤点击运行,这时候提示我们是否保存,我们在jmeter安装目录D:\JMeter\apache-jmeter-5.1.1\下创建文件夹temp_test

然后选择将脚本存放到创建的temp_test目录下。

6.将jmeter安装路径下的D:\JMeter\apache-jmeter-5.1.1\extras的ant-jmeter-1.1.1.jar文件拷贝到ant安装目录D:\JD.com\JmeterScript\apache-ant-1.9.14-bin\apache-ant-1.9.14\下的lib下。这样Ant运行时才能找到"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"这个类,从而成功触发JMeter脚本

7.在temp_test下创建文件夹report

8.将D:\JMeter\apache-jmeter-5.1.1\extras下的build.xml文件拷贝到temp_test中,将build.xml中的内容全部删除后,修改为以下内容(运行.jmx脚本,生成.jtl文件放入C:\Users\songlihui\.jenkins\workspace\xtl_jcyf_接口自动化回归测试/report/jtl文件中,ant在将相应的文件转换为对应的.html文件放入C:\Users\songlihui\.jenkins\workspace\xtl_jcyf_接口自动化回归测试/report/html中)。

<?xml version="1.0" encoding="UTF-8"?>  
  
<project name="jenkins_ant_jmeter20191028" basedir="."> 
    <tstamp>  
        <format property="date" pattern="yyyy/MM/dd kk:mm:ss"/>
		<!--kk是24小时制,KK是12小时制-->        
    </tstamp> 
    <!-- 需要改成自己本地的 Jmeter 目录-->  
    <property name="jmeter.home" value="D:\JMeter\apache-jmeter-5.1.1" />
    <property name="report.title" value="xtl_interface_autoTest"/>    
    <!-- 需要改成自己的----jmeter生成jtl格式的结果报告的路径-->  
    <property name="jmeter.result.jtl.dir" value="C:\Users\songlihui\.jenkins\workspace\xtl_jcyf_接口自动化回归测试/report/jtl" />  
    <!-- 需要改成自己的----jmeter生成html格式的结果报告的路径-->  
    <property name="jmeter.result.html.dir" value="C:\Users\songlihui\.jenkins\workspace\xtl_jcyf_接口自动化回归测试/report/html" />  
    <!-- 生成的报告的前缀-->
    <!-- 生成的报告的名称-->     
    <property name="ReportName" value="DetailsReport" />
    <property name="ReportName2" value="SummaryReport" />   
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />  
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
    <property name="jmeter.result.htmlName2" value="${jmeter.result.html.dir}/${ReportName2}.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="D:\JMeter\apache-jmeter-5.1.1\testcases" includes="*.jmx" />
            <!--声明生成的jtl文件是xml格式,否则会报错 -->
            <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">   
    
        <xslt
              classpathref="xslt.classpath"
              force="true"
              in="${jmeter.result.jtlName}"  
              out="${jmeter.result.htmlName}"  
              style="${jmeter.home}/extras/jmeter-results-report_21.xsl">
              <param name="titleReport" expression="${report.title}"/>
              <param name="dateReport" expression="${date}"/>              
        </xslt>
        <xslt
              classpathref="xslt.classpath"
              force="true"
              in="${jmeter.result.jtlName}"  
              out="${jmeter.result.htmlName2}"
              style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">
              <param name="titleReport" expression="${report.title}"/>
              <param name="dateReport" expression="${date}"/>              
        </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项目环境

1.cd进入到jenkins.war目录,输入命令java -jar jenkins.war --httpPort=8888。端口号8888可以任意改成你想要的,只要是未被其他进程占用的。不过这种启动方式有一个弊端,就是每次启动都需要指定端口号,我们可以通过修改Jenkins安装目录jenkins\jenkins.xml文件修改第41行httpPort为8082(你想要的,未被其他进程占用的),此时如果直接使用命令java -jar jenkins.war,会发现启动的jenkins服务还是用的默认端口8080,并未按修改的jenkins.xml中的端口号进行启动。正确的启动方式是:net start jenkins。。。初次访问http://localhost:8888/,如果发现一直卡在启动界面,提示:Jenkins正在启动,请稍后...

你可以按 Ctrl + C 强制结束启动,然后再次执行上面的命令,发现就会继续启动了,或者可以修改一下配置文件,因为你所在网络可能被限制了,如下:

进入 jenkins 的工作目录,也可以自定义 jenkins 的工作目录,设置 JENKINS_HOME 环境变量,启动 jenkins.war 后将被解压到 JENKINS_HOME 目录下,同时所有 jenkins 的 plugins 和 配置文件等也将被写入到 JENKINS_HOME 所设置的目录下。

打开 hudson.model.UpdateCenter.xml,将 http://updates.jenkins-ci.org/update-center.json 替换成 http://mirror.xmission.com/jenkins/updates/update-center.json,还是不行的话找到 updates 目录下的 default.json 把里面所有的谷歌地址改成百度的,即将 http://www.google.com/ 替换为 http://www.baidu.com/。

待出现如下界面。然后我们进入红色的地址,使用txt文本打开该文件

点击下一步继续,进入插件安装,默认继续到下面页面,开始安装 

 安装完毕,进入初始化用户名密码页

 然后使用注册的用户名密码登录

给任务起一个名字,点击确定 

 其他的保持默认就好,我们在构建中选择invoke ant,然后选择高级

查看我们的build.xml文件, 找到target name,发现我们的target名叫“run”,将这个填写到targets里

点击保存,返回到如下页面,这时候我们点击左侧列表中的build now

然后我们返回到build.xml文件,查看是不是哪里写的不对,然后发现需要改的地方没有改成自己的。

修改为我们自己创建的路径:

 然后最后别忘记保存,我们保存我们最新的对build.xml文件的更改,然后继续返回Jenkins中点击,build now,发现又构建失败了

然后我们点击#2,进去后选择控制台输出,查看一下日志吧

发现哦,原来是build.xml文件中出现了--,

继续打开build.xml文件

去掉后的

然后保存我们对build.xml文件的修改,然后返回Jenkins,我们继续build now

出现问题不要怕,一步一步的找,这次我们发现成功了,变为蓝色了

完事了吗???显然还没有,别忘记我们当时在我们的temp_test下创建了一个report文件夹,这个是做什么用??当然是生成我们的测试报告咯~~,然后我们进入D:\JMeter\apache-jmeter-5.1.1\temp_test\report下的html中赶紧看一下吧。

扩展: 

1.生成的报告中展示细节,如请求的URL、参数、header、返回的header、body等等。例如下图

那我们需要怎么做呢?细心的童鞋可能发现了,在我们的build.xml文件中,我们设置生成了两个报告,一个是SummaryReport,另一个是DetailsReport。summary肯定是一个整体的报告情况,而detail不用说,是更详细的详情。这时候我们就需要用到一个文件jmeter.results.shanhe.me.xsl。在jmeter默认下载安装后,这个文件是没有的。需要单独下载,有好多地址的下载都是受限的,这里给大家找一个可以直接下载的博客地址:jmeter.results.shanhe.me.xsl。下载完成后,把这个文件放到jmeter安装目录下的extra下:

修改我们的build.xml文件

然后重新build now构建一下,去生成报告的地方打开DetailsReport.html,可以看到现在的报告中显示了非常详细的详情。

2.我们在查看报告的时候,发现里面的数据是累加的。比如我们执行了1次构建,生成了报告。又执行了一次,打开报告是第一次+第二次构建执行的脚本情况总和。如果我们只需要打开将最新的执行情况展现,需要怎么做呢?继续打开我们的build.xml文件

需要修改的地方我都框出来了

中间部分代码有点多,我贴到下面。

<!--项目初始化设置-->
  <target name="init" description="init" >
  <!--删除jtl文件夹下生成的所有文件及文件夹包括空目录,但不删除根目录-->
  	<delete verbose="true" includeemptydirs="true" >
  		<fileset dir="${jmeter.result.jtl.dir}" >
          	<include name="**/*" />
          </fileset>
  	</delete>
  <!--删除html文件夹下生成的所有文件及文件夹包括空目录,但不删除根目录-->
      <delete>
          <fileset dir="${jmeter.result.html.dir}">
              <include name="**/*"/>
          </fileset>
      </delete>
          <!--<delete dir="${classes.home}"/>
          <mkdir dir="${classes.home}"/>-->
  </target>

 修改好后,保存build.xml,继续构建。这时候在生成报告前,会先将jtl、html两个文件夹下的内容删除,从而每次生成的报告文件中只有最新一次构建,而不是累加叠加。

3.修改发送报告的样式

<!DOCTYPE html>    
<html>    
<head>    
<meta charset="UTF-8">    
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
</head>    
    
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>    
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                </ul>    

<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>

<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

            </td>    
        </tr>    
    </table>    
</body>    
</html>

 4.这时候前几次的构建报告我们就看不到了,如果还希望看到前几次的怎么办呢?

5.所有的工作做完了,我们想每次测试完成,生成报告,并通过邮箱将测试报告发送给领导和同事们?

后续内容会在空余的时间一点点补充,如果感觉博文的分享能给大家带来提升或者难题的解答,欢迎点赞评论。欢迎添加我的微信,相互学习探讨~1305618688,qq交流群:849102042

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐