1.Jmeter脚本

录制/编写Jmeter脚本(不做描述)

2.Maven项目配置

1、创建一个Maven工程

 

 

 

 

 

 

 

 

 

 

  2、在src/test目录下新建一个jmeter的目录,用来存放jmeter脚本、配置文件、参数化文件;

 

 

 

 3、将需要运行的jmx文件放置在src/test/jmeter目录下,将jmeter bin目录下的配置文件拷贝到src/test/jmeter目录下;

 

 

 

4、修改jmeter.properties文件中的属性值;

 

 

 

 

 

 

 5、在src/test目录下新建一个resources的目录,并将它在项目属性中设置为Test resource用来存放资源文件;

 

 

 

 

 

 

 

 

 

 6、修改pom.xml文件中的配置,该文件是maven的引入jar包、插件的重要配置文件;

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>org.example</groupId>
   <artifactId>JmeterMavenAuto</artifactId>
   <version>1.0-SNAPSHOT</version>

   <name>JmeterMavenAuto</name>
   <!-- FIXME change it to the project's website -->
  
<url>http://www.example.com</url>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.7</maven.compiler.source>
      <maven.compiler.target>1.7</maven.compiler.target>
      <jmeter.result.jtl.dir>${project.build.directory}jmeteresults</jmeter.result.jtl.dir>
      <jmeter.result.html.dir>${project.build.directory}jmeterhtml</jmeter.result.html.dir>
   </properties>

   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <!-- 核心插件,用来执行jmx脚本,版本号对应的jmeter版本可在此地址查询 https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/blob/master/CHANGELOG.md-->
           
<groupId>com.lazerycode.jmeter</groupId>
            <artifactId>jmeter-maven-plugin</artifactId>
            <version>3.5.0</version>
            <configuration>

               <!-- 设置jmeter生成结果文件格式-->
              
<resultsFileFormat>xml</resultsFileFormat>
               <!-- 设置忽略失败是否停止运行-->
              
<ignoreResultFailures>true</ignoreResultFailures>
               <!--设置结果是否有时间戳-->
              
<testResultsTimestamp>false</testResultsTimestamp>
               <testFilesIncluded>
                  <!-- //指定运行的jmeter脚本 -->
                 
<jMeterTestFile>baidu.jmx</jMeterTestFile>
               </testFilesIncluded>
               <!-- 指定jtl生成目录 -->
              
<resultsDirectory>${jmeter.result.jtl.dir}</resultsDirectory>
            </configuration>
            <executions>
               <execution>
                  <id>jmeter-tests</id>
                  <phase>verify</phase>
                  <!--脚本所在的文件夹 -->
                 
<goals>
                     <goal>jmeter</goal>
                  </goals>
               </execution>
               <execution>
                  <id>configuration</id>
                  <goals>
                     <goal>configure</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <!--根据xsl模版把jtl文件转换成html-->
           
<groupId>org.codehaus.mojo</groupId>
            <artifactId>xml-maven-plugin</artifactId>
            <version>1.0-beta-3</version>
            <executions>
               <execution>
                  <phase>verify</phase>
                  <goals>
                     <goal>transform</goal>
                  </goals>
               </execution>
            </executions>
            <configuration>
               <transformationSets>
                  <transformationSet>
                     <dir>${jmeter.result.jtl.dir}</dir>
                     <stylesheet>src\test\resources\jmeter-results-detail-report_21.xsl</stylesheet>
                     <outputDir>${jmeter.result.html.dir}</outputDir>
                     <!-- jtl格式转传承html -->
                    
<fileMappers>
                        <fileMapper
                              implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
                           <targetExtension>html</targetExtension>
                        </fileMapper>
                     </fileMappers>
                  </transformationSet>
               </transformationSets>
            </configuration>
            <!-- using XSLT 2.0 -->
           
<dependencies>
               <dependency>
                  <groupId>net.sf.saxon</groupId>
                  <artifactId>saxon</artifactId>
                  <version>8.7</version>
               </dependency>
            </dependencies>
         </plugin>
      </plugins>
   </build>
</project>

7、Run->Edit Configurations ,Goals里填入verify;

 

 

 

 

3.Maven项目运行

1、运行工程,点击Run或者Maven-verify

 

 

 

 

 

 

 2、执行结果如下表示执行成功,生产相应target文件夹;

 

 

 

 

 

 

 忽略警告,Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor,因为和提供的XSL样式表文件版本有关系。

3、打开本地项目路径,\JmeterMavenAuto\targetjmeterhtml\baidu.html,用浏览器打开html文件;

 

 

 

 4、html文件图片未加载成功,到jmeter安装目录的extras文件夹中,找到collapse.png、expand.png文件,复制到targetjmeterhtml文件夹中,然后刷新html报表;

 

5、报告优化,添加90%Line和QPS

1)添加90%line模板

<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>

<!-- 90% line time -->
<xsl:template name="lineTime">
<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" />
<!-- last()返回当前上下文中的最后一个节点位置数-->
<!--ceiling(number)返回大于number的最小整数-->
<!--floor(number)返回不大于number的最大整数-->
<!--position()返回当前节点位置的数字-->
<!--number(object)使对象转换成数字-->
<xsl:choose>
<!-- 当只有一个节点时,向上取整 -->
<xsl:when test="last() =1">
<xsl:if test="position() = ceiling(last()*0.9)">
<xsl:value-of select="number(.)" />
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:if test="position() = floor(last()*0.9)">
<xsl:value-of select="number(.)" />
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
2)在Summary中添加标题
<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>
<th>90% Line</th>
<th>TPS</th>
</tr>
3)在Summary中添加allLineTime和QPS变量
<xsl:variable name="allMaxTime">
<xsl:call-template name="max">
<xsl:with-param name="nodes" select="/testResults/*/@t" />
</xsl:call-template>
</xsl:variable>

<!--New add 90% line-->
<xsl:variable name="allLineTime">
<xsl:call-template name="lineTime">
<xsl:with-param name="nodes" select="/testResults/*/@t" />
</xsl:call-template>
</xsl:variable>
<!--将毫秒转换成秒-->
<xsl:variable name="qps" select="$allCount*1000 div $allTotalTime" />
4)Summary中调用allLineTime和QPS
<td align="center">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$allMaxTime" />
</xsl:call-template>
</td>

<!--调用allLineTime和qps-->
<td align="center">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$allLineTime" />
</xsl:call-template>
</td>
<td align="center">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$qps" />
</xsl:call-template>
</td>
5)在pagelist中添加标题
<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>90% Line</th>
<th>TPS</th>
<th></th>
</tr>
6)在pagelist中添加allLineTime和QPS变量
<xsl:variable name="maxTime">
<xsl:call-template name="max">
<xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" />
</xsl:call-template>
</xsl:variable>

<!--new add 90% line time-->
<xsl:variable name="nintyTime">
<xsl:call-template name="lineTime">
<xsl:with-param name="nodes" select="../*[@lb=current()/@lb]/@t" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="qpsTime" select="$count*1000 div $totalTime" />
7)在pagelist中调用allLineTime和QPS变量
<td align="right">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$maxTime" />
</xsl:call-template>
</td>

<!--Page页面添加90% LineTime-->
<td align="center">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$nintyTime" />
</xsl:call-template>
</td>
<td align="center">
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$qpsTime" />

</xsl:call-template>
</td>
8)最终效果

4.其他说明

1、Jmeter属性设置的3中方式:

第一种:将jmeter.properties、saveservice.properties、system.properties、upgrade.properties、user.properties复制到项目中,进行修改;

第二种:直接在pom.xml文件中进行配置,放在<configuration>节点下;

 

 

 

 第三种:混合配置。

2、如果需要删除不必要的脚本,因为maven项目是会把src/test/jmeter下的测试脚本复制到target/jmeter/testFiles路径下,这两个路径下的脚本都要删除。(若只删除了src下的,则在运行前进行一次clean)

3、在运行maven后发现未生成html文件夹,查看maven-plugins未引入jmeter插件,引入成功后再次运行结果正确。(重新编辑pom.xml文件保存后引入成功)

maven-plugins未引入jmeter插件一般情况是我们在创建maven项目的时候 默认存在的那个plugins标签是在pluginManagement标签下的,而pluginManagement标签只是对插件的一种声明 而不会对插件进行加载,所以解决办法是我们要在build标签下再写一个plugins标签,然后再把plugin标签放进去。