jenkins+jmeter+ant自动化接口测试集成
搭建环境(JDK、Ant、Jmeter、Jenkin最近版本):
JDK:jdk1.8.0_60
Ant:apache-ant-1.10.2
Jmeter: apache-jmeter-3.0
Jenkins:Jenkins 2.88
1、JDK的安装
双击JDK安装包,选择安装路径C:\Progrom Files\Java\jdk1.8.0_60路径下);
1)系统变量→新建 JAVA_HOME 变量 。
变量值填写jdk的安装目录(本人是 C:\Progrom Files\Java\jdk1.8.0_60);
2)系统变量→寻找 Path 变量→编辑
在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
3)系统变量→新建 CLASSPATH 变量
变量值填写 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (注意最前面有一点)
系统变量配置完毕
4)检验是否配置成功 运行cmd 输入 java -version (java 和 -version 之间有空格)
2、jmeter安装
1)解压apache-jmeter-3.0.zip到D:\Progrom Files目录下。
2)将以下两个文件夹下的插件拷贝到D:\Progrom Files\apache-jmeter-3.0\lib\ext目录下
3)环境变量配置
a、 设置环境变量,新建系统变量在变量名中输入:JMETER_HOME,变量值中输入:D:\Progrom Files\apache-jmeter-3.0,点击确定即可。
b、在环境变量CLASSSPATH中添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;
%JMETER_HOME%\lib\logkit-2.0.jar;(注意:你要看下你的是不是logkit-2.0这个版本).
c、 检验是否配置成功 运行cmd 输入 jmeter -v (jmeter和 -v 之间有空格)
若如图所示 显示版本信息 则说明安装和配置成功。
3、安装ant
1)解压apache-ant-1.10.2.zip到D:\Progrom Files目录下;
2)配置环境变量
a、新建以下环境变量
ANT_HOME:D:\Progrom Files\apache-ant-1.9.7,此为你的ANT安装路径;
b、在环境变量PATH的最后面添加一下内容:
;%ANT_HOME%\bin 注意前面的分号,如果PATH中最后没有分号";"的话要加上,有的话就可去除。
c、进入cmd命令窗口,在CMD窗口中输入ant -version,敲击回城键,会显示出你安装的ANT版本,如果成功显示,说明你的配置应该是成功了。
3)本地调试使用ant构建运行Jmeter,并且生成jtl、Html报告;
jmeter默认保存的是.csv格式的文件,所以我们先要设置一下bin/jmeter.properties文件内容,
1.修改jmeter.properties文件 jmeter.save.saveservice.output_format=xml;
2.将apache-jmeter-3.0\extras\ant-jmeter-1.1.1.jar拷贝到apache-ant-1.10.2\lib目录下;
3.配置D:\Program Files\apache-jmeter-3.0\extras目录下build.xml文件
build文件配置
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <taskdef resource="net/sf/antcontrib/antlib.xml" /> <!-- (1)需要改成自己本地的 Jmeter 目录--> <property name="jmeter.home" value="D:\Program Files\apache-jmeter-3.0"/> <property name="report.title" value="report"/> <!-- (2)jmeter生成jtl格式的结果报告的路径--> <property name="jmeter.result.jtl.dir" value="D:\Program Files\apache-jmeter-3.0\reports\jtl"/> <!-- (3)jmeter生成html格式的结果报告的路径--> <property name="jmeter.result.html.dir" value="D:\Program Files\apache-jmeter-3.0\reports\html"/> <!-- 生成的报告的前缀 --> <property name="ReportName" value="TestReport"/> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl"/> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html"/> <target name="run"> <antcall target="test"/> <antcall target="report"/> <!--antcall target="mail"/--> </target> <target name="test"> <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/> <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- (4)build.xml的存放的路径--> <testplans dir="D:\Program Files\apache-jmeter-3.0\demo" 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.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> <path id="lib_classpath"> <fileset dir="${basedir}/"> <include name="mail*.jar" /> <include name="activation*.jar" /> <include name="commons-email*.jar" /> <include name="ant-contrib*.jar" /> </fileset> </path> <!--target name="mail"> <for list="hanxm@thunisoft.com" param="tmp" > <sequential> <echo>message @{tmp}</echo> <mail mailhost="smtp.thunisoft.com" mailport="25" ssl="false" subject="ant mail" messagemimetype="text/html" user="zhangjn" password="*******" tolist="@{tmp}"> <from address="zhangjn@thunisoft.com" /> <fileset dir="${jmeter.result.html.dir}"> <include name="*.html" /> <include name="*.png" /> </fileset> <message>支持多人同时发邮件!!<br /><br /></message> </mail> </sequential> </for> </target--> </project>
备注:注释中的(1)(2)(3)(4)该成自己的路径;jmeter-results-detail-report.xsl这个配置值在你的
${jmeter.home}/extras目录下是不是这个名称,配置改成jmeter 安装目录extras下 对应的(jmeter-results-detail-report.xsl)这个文件名称
不同jmeter 版本这个文件名称可能不一样;把build.xml文件放到(4 build.xml的存放的路径)中配置的这个路径中
D:\Program Files\apache-jmeter-3.0\,并把要执行的脚本也放到同一目录下,如图:
5、cmd到demo的目录下执行ant命令,如图:
以上说明执行成功了,到你配置的报告目录下去看生成的报告D:\Program Files\apache-jmeter-3.0\reports\html
备注:如果生成的报告为空的,可能是你的jmeter-results-detail-report.xsl配置有问题可以参考一下配置: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Stylesheet for processing 2.1 output format test result files To uses this directly in a browser, add the following to the JTL file as line 2: <?xml-stylesheet type="text/xsl" href="../extras/jmeter-results-detail-report_21.xsl"?> and you can then view the JTL in a browser --> <xsl:output method="html" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" /> <!-- Defined parameters (overrideable) --> <xsl:param name="showData" select="'n'"/> <xsl:param name="titleReport" select="'Load Test Results'"/> <xsl:param name="dateReport" select="'date not defined'"/> <xsl:template match="testResults"> <html> <head> <title><xsl:value-of select="$titleReport" /></title> <style type="text/css"> body { font:normal 68% verdana,arial,helvetica; color:#000000; } table tr td, table tr th { font-size: 68%; } table.details tr th{ color: #ffffff; font-weight: bold; text-align:center; background:#2674a6; white-space: nowrap; } table.details tr td{ background:#eeeee0; white-space: nowrap; } h1 { margin: 0px 0px 5px; font: 165% verdana,arial,helvetica } h2 { margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica } h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica } .Failure { font-weight:bold; color:red; } img { border-width: 0px; } .expand_link { position=absolute; right: 0px; width: 27px; top: 1px; height: 27px; } .page_details { display: none; } .page_details_expanded { display: block; display/* hide this definition from IE5/6 */: table-row; } </style> <script language="JavaScript"><![CDATA[ function expand(details_id) { document.getElementById(details_id).className = "page_details_expanded"; } function collapse(details_id) { document.getElementById(details_id).className = "page_details"; } function change(details_id) { if(document.getElementById(details_id+"_image").src.match("expand")) { document.getElementById(details_id+"_image").src = "collapse.png"; expand(details_id); } else { document.getElementById(details_id+"_image").src = "expand.png"; collapse(details_id); } } ]]></script> </head> <body> <xsl:call-template name="pageHeader" /> <xsl:call-template name="summary" /> <hr size="1" width="95%" align="center" /> <xsl:call-template name="pagelist" /> <hr size="1" width="95%" align="center" /> <xsl:call-template name="detail" /> </body> </html> </xsl:template> <xsl:template name="pageHeader"> <h1><xsl:value-of select="$titleReport" /></h1> <table width="100%"> <tr> <td align="left">Date report: <xsl:value-of select="$dateReport" /></td> <td align="right">Designed for use with <a href="http://jmeter.apache.org/">JMeter</a> and <a href="http://ant.apache.org">Ant</a>.</td> </tr> </table> <hr size="1" /> </xsl:template> <xsl:template name="summary"> <h2>Summary</h2> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th># Samples</th> <th>Failures</th> <th>Success Rate</th> <th>Average Time</th> <th>Min Time</th> <th>Max Time</th> </tr> <tr valign="top"> <xsl:variable name="allCount" select="count(/testResults/*)" /> <xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::s='false'])" /> <xsl:variable name="allSuccessCount" select="count(/testResults/*[attribute::s='true'])" /> <xsl:variable name="allSuccessPercent" select="$allSuccessCount div $allCount" /> <xsl:variable name="allTotalTime" select="sum(/testResults/*/@t)" /> <xsl:variable name="allAverageTime" select="$allTotalTime div $allCount" /> <xsl:variable name="allMinTime"> <xsl:call-template name="min"> <xsl:with-param name="nodes" select="/testResults/*/@t" /> </xsl:call-template> </xsl:variable> <xsl:variable name="allMaxTime"> <xsl:call-template name="max"> <xsl:with-param name="nodes" select="/testResults/*/@t" /> </xsl:call-template> </xsl:variable> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="$allFailureCount > 0">Failure</xsl:when> </xsl:choose> </xsl:attribute> <td align="center"> <xsl:value-of select="$allCount" /> </td> <td align="center"> <xsl:value-of select="$allFailureCount" /> </td> <td align="center"> <xsl:call-template name="display-percent"> <xsl:with-param name="value" select="$allSuccessPercent" /> </xsl:call-template> </td> <td align="center"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$allAverageTime" /> </xsl:call-template> </td> <td align="center"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$allMinTime" /> </xsl:call-template> </td> <td align="center"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$allMaxTime" /> </xsl:call-template> </td> </tr> </table> </xsl:template> <xsl:template name="pagelist"> <h2>Pages</h2> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th>URL</th> <th># Samples</th> <th>Failures</th> <th>Success Rate</th> <th>Average Time</th> <th>Min Time</th> <th>Max Time</th> <th></th> </tr> <xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]"> <xsl:variable name="label" select="@lb" /> <xsl:variable name="count" select="count(../*[@lb = current()/@lb])" /> <xsl:variable name="failureCount" select="count(../*[@lb = current()/@lb][attribute::s='false'])" /> <xsl:variable name="successCount" select="count(../*[@lb = current()/@lb][attribute::s='true'])" /> <xsl:variable name="successPercent" select="$successCount div $count" /> <xsl:variable name="totalTime" select="sum(../*[@lb = current()/@lb]/@t)" /> <xsl:variable name="averageTime" select="$totalTime div $count" /> <xsl:variable name="minTime"> <xsl:call-template name="min"> <xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" /> </xsl:call-template> </xsl:variable> <xsl:variable name="maxTime"> <xsl:call-template name="max"> <xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" /> </xsl:call-template> </xsl:variable> <tr valign="top"> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="$failureCount > 0">Failure</xsl:when> </xsl:choose> </xsl:attribute> <td> <xsl:if test="$failureCount > 0"> <a><xsl:attribute name="href">#<xsl:value-of select="$label" /></xsl:attribute> <xsl:value-of select="$label" /> </a> </xsl:if> <xsl:if test="0 >= $failureCount"> <xsl:value-of select="$label" /> </xsl:if> </td> <td align="center"> <xsl:value-of select="$count" /> </td> <td align="center"> <xsl:value-of select="$failureCount" /> </td> <td align="right"> <xsl:call-template name="display-percent"> <xsl:with-param name="value" select="$successPercent" /> </xsl:call-template> </td> <td align="right"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$averageTime" /> </xsl:call-template> </td> <td align="right"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$minTime" /> </xsl:call-template> </td> <td align="right"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$maxTime" /> </xsl:call-template> </td> <td align="center"> <a href=""> <xsl:attribute name="href"><xsl:text/>javascript:change('page_details_<xsl:value-of select="position()" />')</xsl:attribute> <img src="expand.png" alt="expand/collapse"><xsl:attribute name="id"><xsl:text/>page_details_<xsl:value-of select="position()" />_image</xsl:attribute></img> </a> </td> </tr> <tr class="page_details"> <xsl:attribute name="id"><xsl:text/>page_details_<xsl:value-of select="position()" /></xsl:attribute> <td colspan="8" bgcolor="#FF0000"> <div align="center"> <b>Details for Page "<xsl:value-of select="$label" />"</b> <table bordercolor="#000000" bgcolor="#2674A6" border="0" cellpadding="1" cellspacing="1" width="95%"> <tr> <th>Thread</th> <th>Iteration</th> <th>Time (milliseconds)</th> <th>Bytes</th> <th>Success</th> </tr> <xsl:for-each select="../*[@lb = $label and @tn != $label]"> <tr> <td><xsl:value-of select="@tn" /></td> <td align="center"><xsl:value-of select="position()" /></td> <td align="right"><xsl:value-of select="@t" /></td> <!-- TODO allow for missing bytes field --> <td align="right"><xsl:value-of select="@by" /></td> <td align="center"><xsl:value-of select="@s" /></td> </tr> </xsl:for-each> </table> </div> </td> </tr> </xsl:for-each> </table> </xsl:template> <xsl:template name="detail"> <xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::s='false'])" /> <xsl:if test="$allFailureCount > 0"> <h2>Failure Detail</h2> <xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]"> <xsl:variable name="failureCount" select="count(../*[@lb = current()/@lb][attribute::s='false'])" /> <xsl:if test="$failureCount > 0"> <h3><xsl:value-of select="@lb" /><a><xsl:attribute name="name"><xsl:value-of select="@lb" /></xsl:attribute></a></h3> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th>Response</th> <th>Failure Message</th> <xsl:if test="$showData = 'y'"> <th>Response Data</th> </xsl:if> </tr> <xsl:for-each select="/testResults/*[@lb = current()/@lb][attribute::s='false']"> <tr> <td><xsl:value-of select="@rc | @rs" /> - <xsl:value-of select="@rm" /></td> <td><xsl:value-of select="assertionResult/failureMessage" /></td> <xsl:if test="$showData = 'y'"> <td><xsl:value-of select="./binary" /></td> </xsl:if> </tr> </xsl:for-each> </table> </xsl:if> </xsl:for-each> </xsl:if> </xsl:template> <xsl:template name="min"> <xsl:param name="nodes" select="/.." /> <xsl:choose> <xsl:when test="not($nodes)">NaN</xsl:when> <xsl:otherwise> <xsl:for-each select="$nodes"> <xsl:sort data-type="number" /> <xsl:if test="position() = 1"> <xsl:value-of select="number(.)" /> </xsl:if> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="max"> <xsl:param name="nodes" select="/.." /> <xsl:choose> <xsl:when test="not($nodes)">NaN</xsl:when> <xsl:otherwise> <xsl:for-each select="$nodes"> <xsl:sort data-type="number" order="descending" /> <xsl:if test="position() = 1"> <xsl:value-of select="number(.)" /> </xsl:if> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="display-percent"> <xsl:param name="value" /> <xsl:value-of select="format-number($value,'0.00%')" /> </xsl:template> <xsl:template name="display-time"> <xsl:param name="value" /> <xsl:value-of select="format-number($value,'0 ms')" /> </xsl:template> </xsl:stylesheet>
4、jenkins安装
1)之前本地已经安装过jenkins了,这里就不在讲如何安装jenkins。
2)jenkins构建项目
a、输入任务名称,点击构建一个自由风格的软件项目,点击确定
b、在构建中添加Invoke Ant
c、在点击高级
配置你在build.xml文件中配置的build.xml的路径,点击保存
d、点击立即构建,出现蓝色说明执行成功了,如图:
备注:到你在build.xml中配置的报告路径去找执行后的报告就可以了。
————————————————
版权声明:本文为CSDN博主「qq_30684681」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30684681/article/details/79577372