windows jmeter + ant集成(模板自定义)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Rainday666/article/details/102626060

一、 安装包准备

JDK:jdk1.8.0_91

Ant:apache-ant-1.9.14-bin.zip

Jmeter:apache-jmeter-3.2

二、 安装JDK

安装时,一直点下一步就可以,也可以选择自己想安装的目录进行安装。

1、配置JAVA_HOME变量:

桌面右键计算机=>属性=>高级系统设置=>环境变量=>系统变量=>新建

变量名为JAVA_HOME 变量值填写jdk安装路径,如果安装多个jdk版本,在此处写哪个路径就可直接变更jdk版本

2、系统变量=>Path,双击打开编辑

在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

注意,所有变量值之间都必须有英文分号;隔开
4、打开命令行,输入java-version,会打印出当前JDK的版本号

三、 安装Jmeter

1、 直接解压Jmeter压缩包,就算安装成功了

3、配置Jmeter环境变量

1)新建系统变量,变量名称:JMETER_HOME,变量值:E:\Program Files\drver\Jmeter\apache-jmeter-3.2
在这里插入图片描述
2)在系统变量中Path中添加%JMETER_HOME%\bin

3)打开命令行,输入jmeter-v,打印出jmeter版本号表示安装成功

四、 安装Ant

1、直接解压apache-ant-1.9.14-bin.zip到想要的目录,就算安装成功了

2、 配置Ant环境变量

  1. 新建系统变量:ANT_HOME,变量值为Ant的本地安装路径,如我的:E:\Program Files\drver\ant\apache-ant-1.9.14
    在这里插入图片描述

  2. 在系统变量Path后添加%ANT_HOME%\bin

3)打开命令行,输入ant-version,打印出ant版本号表示配置成功

五、构建build.xml

1)路径下文件介绍:
apache-jmeter-3.2\extras目录下存放了ant集成jmeter所需要的jar包ant-jmeter-1.1.1.jar、build.xml文件build.xml ,报告模板jmeter-results-detail-report_21.xsl,jmeter-results-report_21.xsl
2)build.xml文件的配置如下:
添加链接描述

3)windows下JMETER + ANT集成搭建完成
4)在/extras目录下执行ant,生成html报告
5)生成的jmeter-results-detail-report_21.xsl报告中如果展开图片不显示:
实际上jmeter是jmeter引用的是本地的文件,需要将两个图片放在html
报告生成的路径下
6)在/extras目录下有两个报告模板:
1:jmeter-results-detail-report_21.xsl
2:jmeter-results-report_21.xsl
–其实两个模板没有多少差异化,第一个是详细的,能展开的;
第二个是大致的报告模板

六、自定义报告模板,添加tps 和90%line即用户体验信息和95%line

复制如下:
<?xml version="1.0" encoding="utf-8" ?>
<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>
			<!-- add-->
			<th>Last Time</th>
			<th>每秒事务数</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>
			<!--QPS/TPS -->
			<!-- 场景开始时间 -->
			<xsl:variable name="allstartTime">
				<xsl:call-template name="sTime">
					<xsl:with-param name="nodes" select="/testResults/*/@ts" />
				</xsl:call-template>
			</xsl:variable>
			<!-- endtime -->
			<xsl:variable name="allendTime">
				<xsl:call-template name="eTime">
					<xsl:with-param name="nodes" select="/testResults/*/@ts" />
				</xsl:call-template>	
			</xsl:variable>
			<!-- lasttime -->
			<xsl:variable name="alllastTime">
				<xsl:for-each select="/testResults/*">
					<xsl:if test="./@ts = $allendTime">
						<xsl:value-of select="./@t" />  
					</xsl:if>
				</xsl:for-each>
			</xsl:variable>
			<!--QPS/TPS=-->
			<xsl:variable name="alltps" select="$allCount * 1000 div ($allendTime + $alllastTime - $allstartTime)" />
			
			<xsl:attribute name="class">
				<xsl:choose>
					<xsl:when test="$allFailureCount &gt; 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>
			<!-- lastTime -->
			<td align="right">
				<xsl:call-template name="display-time">
					<xsl:with-param name="value" select="$alllastTime" />
				</xsl:call-template>
			</td>
			<!-- QPS -->
			<td align="right">
				<xsl:call-template name="display-tps">
					<xsl:with-param name="value" select="$alltps" />
			  </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>
			<!-- 添加PageList 的TPS列,即每一个请求的TPS -->
			<th>QPS/TPS</th>
			<!-- 90%用户体验数据 列名 -->
			<th>90%Line</th>
			<th>95%Line</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>
			
			<!--QPS/TPS -->
			<!-- startTime -->
			<xsl:variable name="startTime">
				<xsl:call-template name="sTime">
					<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@ts" />
				</xsl:call-template>
			</xsl:variable>
			<!-- endTime -->
			<xsl:variable name="endTime">
				<xsl:call-template name="eTime">
					<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@ts" />
				</xsl:call-template>	
			</xsl:variable>
			
			<!-- lastTime -->
			<xsl:variable name="lastTime">
				<xsl:for-each select="../*[@lb = current()/@lb]">
					<xsl:if test="./@ts = $endTime">
						<xsl:value-of select="./@t"/>  
					</xsl:if>
				</xsl:for-each>
			</xsl:variable>
			<!--QPS/TPS=-->
			<xsl:variable name="tps" select="$count * 1000 div ($endTime + $lastTime - $startTime)" />
			
			<!-- 90%用户体验数据 值-->
			<xsl:variable name="percenttime">
				<xsl:call-template name="percent90">
					<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" />
				</xsl:call-template>
			</xsl:variable>
			
			<xsl:variable name="percenttime1">
				<xsl:call-template name="percent95">
					<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 &gt; 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>
				<!-- add new TPS -->
				<td align="right">
					<xsl:call-template name="display-tps">
						<xsl:with-param name="value" select="$tps" />
					</xsl:call-template>
				</td>
				
				<!--将90%line的值写入对应的列-->
				<td align="right">
					<xsl:call-template name="display-time">
						<xsl:with-param name="value" select="$percenttime" />
					</xsl:call-template>
				</td>
				
				<td align="right">
					<xsl:call-template name="display-time">
						<xsl:with-param name="value" select="$percenttime1" />
					</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>

<!-- startTime template -->
<xsl:template name="sTime">
	<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>

<!-- endTime template -->
<xsl:template name="eTime">
	<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>

<!-- Add New display-tps -->
<xsl:template name="display-tps">
	<xsl:param name="value" />
	<xsl:value-of select="format-number($value,'0.00 /sec')" />
</xsl:template>

<!-- 90%line的数据处理模板 -->
<xsl:template name="percent90">
	<xsl:param name="nodes" select="/.." />
	<xsl:param name="mycount" select="count($nodes)" />
	<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() = round($mycount * 0.9)">
					<xsl:value-of select="number(.)" />
				</xsl:if>
			</xsl:for-each>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>

<xsl:template name="percent95">
	<xsl:param name="nodes" select="/.." />
	<xsl:param name="mycount" select="count($nodes)" />
	<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() = round($mycount * 0.95)">
					<xsl:value-of select="number(.)" />
				</xsl:if>
			</xsl:for-each>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>

</xsl:stylesheet>

展示效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Rainday666/article/details/102626060