Jmeter使用筆記之html報告擴展(一)


題記:在用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,使用格式如下:

xsltproc xsl-html.xsl hoto.xml -o html.html   (這里還可以直接把樣式表文件寫入jtl文件的href屬性中,直觀的告訴這個XML用哪個樣式表)
 
xls中查找XML用的xpath,因此還需要對xpath熟悉,xsltproc這個引擎用的是xpath1.0版本,因此在樣式表中使用xpath是不能使用xpath2.0的函數
和一些屬性。
個人對xpath還算熟悉,但是對xls一點也不熟悉,沒辦法為了能夠擴展報告,直接學習xls和xpath。(關於xls會再寫一遍博客介紹,順便把使用過程中
的問題和經驗匯總)
 
如果直接使用ant和Jmeter集成后也是可以直接生成的,但是ant轉換HTML的引擎也是只支持xpath1.0,后來經過了解大部分的引擎都不支持xpath2.0,所以
期中不能使用xpath2.0的函數。
 
90%Line時間
為了能夠顯示90%Line的時間,首先要對這個指標熟悉,這個指標值得是一組數據,在90%的位置的數據的時間,所以我們擴展的時候只要知道了90%
位置的索引,那么就能取得這個值了。
以下是部分關鍵代碼
            <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的測試結果文件每個字段戴表什么意思熟悉,這樣才能定制更多的指標,這個也會在單獨的博客中說明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM