一、本文目的:
之前寫(xiě)了兩篇文章搭建持續(xù)集成接口測(cè)試平臺(tái)(Jenkins+Ant+Jmeter)和ANT批量執(zhí)行Jmeter腳本,功能實(shí)現(xiàn)上都沒(méi)有什么問(wèn)題,但是后生成的報(bào)告有一點(diǎn)小問(wèn)題,雖然不影響使用,但總是感覺(jué)不夠完美,具體問(wèn)題如下:
1、Date report這里的時(shí)間沒(méi)有正確顯示出來(lái)
2、Summary里的字段Min Time和Max Time顯示的是NaN,沒(méi)有顯示正確的時(shí)間。
本文主要解決上述兩個(gè)問(wèn)題,具體報(bào)告如何生成可參考上面提到的兩篇文章。
二、Jmeter+Ant報(bào)告生成原理:
在解決問(wèn)題之前,讓我們先弄清楚Jmeter+Ant是生成報(bào)告的原理,知道原理后我們可以很從容的解決問(wèn)題了。另外,如果后續(xù)我們想定制報(bào)告也很容易了。
1、在Jmeter的extras目錄下,官方已經(jīng)為我們提供了一個(gè)現(xiàn)成的實(shí)例,我們只需要在該目錄下執(zhí)行ant命令可以生成一個(gè)數(shù)據(jù)文件Test.jtl和一個(gè)報(bào)告Test.html(PS:如果沒(méi)有安裝ant需要先去安裝,不會(huì)用ant的自行百度)。
2、知道了上一步后,接下來(lái)我們研究的重點(diǎn)是extras目錄下的build.xml文件了,具體研究細(xì)節(jié)不在此細(xì)說(shuō)了,因?yàn)檫@部分內(nèi)容屬于ant的范圍,有需要的可以自行補(bǔ)充下ant的知識(shí)。
三、解決問(wèn)題:
1、找到extras目錄下build.xml文件內(nèi)容的如下部分:它的作用是把生成的.jtl數(shù)據(jù)文件轉(zhuǎn)換為.html格式的報(bào)告
具體屬性的含義:
in:生成的.jtl文件的路徑
out:生成的.html文件的路徑
style:從.jtl轉(zhuǎn)換成.html所使用的樣式,這些文件也在extras目錄下,這個(gè)是重要的部分,如果我們想定制報(bào)告可以自行定義這個(gè)文件或者從網(wǎng)上找一些合適的文件。
param:參數(shù),這幾個(gè)參數(shù)可以在style中使用,下面會(huì)講到。
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數(shù)據(jù)文件轉(zhuǎn)換成.html格式的報(bào)告
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、通過(guò)上面的分析,style 文件是整成報(bào)告轉(zhuǎn)換的關(guān)鍵,那我們打開(kāi)jmeter-results-detail-report_21.xsl這個(gè)文件看看,找到如下幾行,這里也定義了三個(gè)參數(shù)跟build.xml文件中一樣,由此可猜測(cè),我們只要在build.xml文件中定義dateReport這個(gè)參數(shù)和值,在style中可以按如下方式使用,經(jīng)過(guò)測(cè)試證明猜測(cè)是正確的,那么第一個(gè)問(wèn)題解決了:
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、對(duì)于第二個(gè)問(wèn)題,其實(shí)把第1步中的代碼復(fù)制到我們自己的build.xml文件中后,可以一并解決這兩個(gè)問(wèn)題。解決第二個(gè)總是的關(guān)鍵代碼是第9行和第10行:
classpathref="xslt.classpath"
force="true"
而第9行又引用了第1~4行
4、到此,兩個(gè)問(wèn)題都解決了,終修改后的build.xml文件如下,標(biāo)黃是解決總是添加的代碼:
<?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="接口測(cè)試"/>
<!-- jmeter生成jtl格式的結(jié)果報(bào)告的路徑-->
<property name="jmeter.result.jtl.dir" value="/Users/Desktop/jmx/report" />
<!-- jmeter生成html格式的結(jié)果報(bào)告的路徑-->
<property name="jmeter.result.html.dir" value="/Users/Desktop/jmx/report" />
<!-- 生成的報(bào)告的前綴-->
<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}">
<!-- 聲明要運(yùn)行的腳本"*.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>
<!-- 因?yàn)樯厦嫔蓤?bào)告的時(shí)候,不會(huì)將相關(guān)的圖片也一起拷貝至目標(biāo)目錄,所以,需要手動(dòng)拷貝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
5、修改后的報(bào)告: