一、本文目的:
之前寫了兩篇文章搭建持續集成接口測試平臺(Jenkins+Ant+Jmeter)和ANT批量執行Jmeter腳本,功能實現上都沒有什么問題,但是后生成的報告有一點小問題,雖然不影響使用,但總是感覺不夠完美,具體問題如下:
1、Date report這里的時間沒有正確顯示出來
2、Summary里的字段Min Time和Max Time顯示的是NaN,沒有顯示正確的時間。
本文主要解決上述兩個問題,具體報告如何生成可參考上面提到的兩篇文章。
二、Jmeter+Ant報告生成原理:
在解決問題之前,讓我們先弄清楚Jmeter+Ant是生成報告的原理,知道原理后我們可以很從容的解決問題了。另外,如果后續我們想定制報告也很容易了。
1、在Jmeter的extras目錄下,官方已經為我們提供了一個現成的實例,我們只需要在該目錄下執行ant命令可以生成一個數據文件Test.jtl和一個報告Test.html(PS:如果沒有安裝ant需要先去安裝,不會用ant的自行百度)。
2、知道了上一步后,接下來我們研究的重點是extras目錄下的build.xml文件了,具體研究細節不在此細說了,因為這部分內容屬于ant的范圍,有需要的可以自行補充下ant的知識。
三、解決問題:
1、找到extras目錄下build.xml文件內容的如下部分:它的作用是把生成的.jtl數據文件轉換為.html格式的報告
具體屬性的含義:
in:生成的.jtl文件的路徑
out:生成的.html文件的路徑
style:從.jtl轉換成.html所使用的樣式,這些文件也在extras目錄下,這個是重要的部分,如果我們想定制報告可以自行定義這個文件或者從網上找一些合適的文件。
param:參數,這幾個參數可以在style中使用,下面會講到。
path:添加jar包的路徑,在下面的target中有引用到(下面第9行)。
1 <path id="xslt.classpath">//jar的路徑
2 <fileset dir="${lib.dir}" includes="xalan*.jar"/>
3 <fileset dir="${lib.dir}" includes="serializer*.jar"/>
4 </path>
5 //把生成的.jtl數據文件轉換成.html格式的報告
6 <target name="xslt-report" depends="_message_xalan">
7 <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
8 <xslt
9 classpathref="xslt.classpath"
10 force="true"
11 in="${testpath}/${test}.jtl"
12 out="${testpath}/${test}.html"
13 style="${basedir}/jmeter-results-detail-report${style_version}.xsl">
14 <param name="showData" expression="${show-data}"/>
15 <param name="titleReport" expression="${report.title}"/>
16 <param name="dateReport" expression="${report.datestamp}"/>
17 </xslt>
18 </target>
2、通過上面的分析,style 文件是整成報告轉換的關鍵,那我們打開jmeter-results-detail-report_21.xsl這個文件看看,找到如下幾行,這里也定義了三個參數跟build.xml文件中一樣,由此可猜測,我們只要在build.xml文件中定義dateReport這個參數和值,在style中可以按如下方式使用,經過測試證明猜測是正確的,那么第一個問題解決了:
1 <xsl:param name="showData" select="'n'"/>
2 <xsl:param name="titleReport" select="'Load Test Results'"/>
3 <xsl:param name="dateReport" select="'date not defined'"/>
3、對于第二個問題,其實把第1步中的代碼復制到我們自己的build.xml文件中后,可以一并解決這兩個問題。解決第二個總是的關鍵代碼是第9行和第10行:
classpathref="xslt.classpath"
force="true"
而第9行又引用了第1~4行
4、到此,兩個問題都解決了,終修改后的build.xml文件如下,標黃是解決總是添加的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<!-- 需要改成自己本地的 Jmeter 目錄-->
<property name="jmeter.home" value="/Users/Tools/Jmeter" />
<property name="report.title" value="接口測試"/>
<!-- jmeter生成jtl格式的結果報告的路徑-->
<property name="jmeter.result.jtl.dir" value="/Users/Desktop/jmx/report" />
<!-- jmeter生成html格式的結果報告的路徑-->
<property name="jmeter.result.html.dir" value="/Users/Desktop/jmx/report" />
<!-- 生成的報告的前綴-->
<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" />
</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="/Users/Desktop/jmx" 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>
5、修改后的報告: