題記:在用loadrunner的時候可以生成一個HTML的報告,並且里面包含各種圖表,各種詳細的數據。而在使用Jmeter測試完后並不能直接生成Html
的報告(無論是用GUI還是命令行啟動)。
經過查找資料發現Jmeter的extras目錄下有生成HTML的xsl樣式表,其實Jenkins+ant+Jmeter生成的HTML報告也是調用了這里的樣式表生成的,於是
通過xsltproc report.jtl > test.html,或者ant也可以。這個命令把Jmeter的結果文件轉換為HTML的報告。結果如下:
這里雖然能生成HTML報告了,但是這個報告太弱了,基本不能用,包含的參數太少。所以需要對這個報告進行擴展。因為Jmeter本身的聚合報告的數據還是比較全的,
因此打算按照那個報告的值進行擴展。
xsltproc,xlst介紹
XSL 指擴展樣式表語言(EXtensible Stylesheet Language),把XML轉換為HTML用的就是xls編寫的樣式表,所以如果要擴展這個報告,首先要對xls
熟悉,才能更改和擴展樣式表。可以在http://www.w3school.com.cn/xsl/index.asp這里進行此語言的學習。
xsltproc是一個快速XSLT引擎,它可以將通過XSL層疊樣式表把XML轉換為相應格式的文件,比如:HTML,XHTML,PDF
比如將XML轉換為HTML,使用格式如下:
<xsl:variable name="allMedianTime">
<xsl:call-template name="LineTime">
<xsl:with-param name="nodes" select="/testResults/*/@t" />
<xsl:with-param name="position" select="ceiling($allCount * 0.9)" />
</xsl:call-template>
</xsl:variable>
這里主要是獲得時間元素的集合,以及90%line的位置,有了這兩個參數后就可以進行后續的擴展了,擴展后的效果圖如下:
因為90%Line和95%Line,99%Line計算原理都是一致的,因此只要計算出一個值其他的值也很好計算
QPS擴展
Jmeter的具合報告有Throughput這個值,這個在loadrunner中是表示為吞吐量的,這里可以表示QPS或者TPS(在使用了事務的情況下),個人把這個稱為QPS,因為更直觀。
和%90Line同樣的道理,首先必須知道這個值是怎么計算出來,經過查找資料和官網的比較,發現這個值是通過如下的公式計算出來的:
官網的截圖:
Throughput = (number of requests) / (total time)
total time = 測試結束時間 - 測試開始時間
測試結束時間 = MAX(請求開始時間 + Elapsed Time)
測試開始時間 = MIN(請求開始時間)
知道了公式,那么計算就容易了,以下是關鍵代碼:
<xsl:variable name="nodeThroughput">
<xsl:call-template name="throughput">
<xsl:with-param name="nodes" select="/testResults/*/@ts" />
<xsl:with-param name="count" select="$allCount" />
</xsl:call-template>
</xsl:variable>
擴展后的結果如下:
吞吐量擴展
在loadrunner中吞吐量就是Throughput,在Jmeter的聚合報告中最后一列的值就是loadrunner中的Throughput,為了便於區分,我把這里的值稱為Throughput,
也就是吞吐量。
經過查找資料發現吞吐量的計算和QPS的計算公式是一樣的,因為也就是如下的公式:
Throughput = (請求的總字節數) / (total time)
這里的total time計算和QPS是一樣的,而總字節數直接把所有請求的加起來即可,關鍵代碼如下:
<xsl:variable name="nodeKB">
<xsl:call-template name="throughput">
<xsl:with-param name="nodes" select="/testResults/*/@ts" />
<xsl:with-param name="count" select="sum(/testResults/*/@by) div 1024" />
</xsl:call-template>
</xsl:variable>
因為這里顯示的字節,最后的結果我打算以KB的單位顯示,因此這里需要除以1024,擴展后的結果如下
TPS擴展
TPS在Jmeter中雖然某些情況和QPS是一致的,但是還是有不一致的地方,因此這里也需要擴展,這樣的結果看着更清晰明了。
首先和其他的參數擴展一樣,需要知道計算公式,這里的計算公式和QPS也是一樣的,只是數據的集合不一樣,以下是擴展后的效果。
在擴展的過程中進一步發現Jmeter的聚合結果中最后的”總體“一行在某些情況下計算的數值是不准確的。如果腳本中不包含事務,那么這里的結果是准確的,如果都包含事務並且把
Generate parent sample選中后這里的結果也是准確的,在腳本中有事務並且沒有選中Generate parent sample,或者有些有事務有些沒有時,這時的結果就不准確了,因為查看計算
方式發現它把所有的請求都算進去了。
比如,一個jtl文件中即包含HTTP請求也包含事務,因為事務只是對之前請求的一個統計,本身是不發送請求的,所以計算總的吞吐量、QPS,TPS時是不能這么算的。
所以在擴展的過程中分成了兩個樣式表,一個樣式表處理包含事務,或者沒有事務的情況,這時的結果以QPS衡量;一個樣式表處理全都是事務的情況,這時候的結果以TPS衡量,這樣
就准確了。
測試
擴展了好幾個指標,這些指標的正確性如何呢?需要在多種情況下進行測試,經過測試后各個指標都是正確的。但是還沒有在大的數據量級別下測試,如果測試后發現哪里會有問題,會及時
更改。
切記:由於樣式表中是按照lb進行請求區分的,因此這里的lable不能重復,本身也不應該重復,包括Jmeter的聚合報告都是以lable進行區分的
PS:在擴展過程中的難點一是公式如何計算的,二是xls這個 指擴展樣式表語言不是很熟悉,本身也有很多限制,會在下個博客中說明。但是用過后感覺還是很不錯的既熟悉了xpath還熟悉了xls。
三是需要對Jmeter的測試結果文件每個字段戴表什么意思熟悉,這樣才能定制更多的指標,這個也會在單獨的博客中說明