繼上篇Blog,本篇將重點介紹利用Maven並開發插件解析Jmeter生成的報告,於是就有Jmeter-analysis-maven-plugin這個插件,這個插件是由Aren Franka開發的,但是當你使用這個插件的時候會發現,它只能解析Http request請求的報告,不能解析如Webservice request請求的報告以及其他請求的報告,這是由於這個插件的代碼中存在一個bug,於是自己動手修改了這個bug,因為通過Nongui生成的Jmeter報告是以.jtl結尾的類似於xml的文件,因此在Jmeter-analysis-maven-plugin這個插件中會采用SAX來解析報告文件。具體來看一下Jmeter報告文件的格式:
<?xml version="1.0" encoding="UTF-8"?> <testResults version="1.2"> <sample t="49" lt="0" ts="1339404299860" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-1" dt="text" by="713"/> <sample t="45" lt="0" ts="1339404301064" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-13" dt="text" by="713"/> <sample t="45" lt="0" ts="1339404301166" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-14" dt="text" by="713"/> <sample t="53" lt="0" ts="1339404301266" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-15" dt="text" by="713"/> <sample t="49" lt="0" ts="1339404301362" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-16" dt="text" by="713"/> <sample t="129" lt="0" ts="1339404301465" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-17" dt="text" by="713"/> <sample t="51" lt="0" ts="1339404301564" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-18" dt="text" by="713"/> <sample t="55" lt="0" ts="1339404301665" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-19" dt="text" by="713"/> <sample t="53" lt="0" ts="1339404301764" s="true" lb="PoscPaymentServiceImplService" rc="200" rm="OK" tn="posc 1-20" dt="text" by="713"/> </testResults>
這是一個webservice請求所得到的測試結果,所以每個請求都是以sample開始的,如果是http請求的話,會以httpsample開始,大家可以在我的代碼中看到我用了一個hashset將這兩種element都放在里面,然后通過判斷是否存在相關的element來解析報告,原代碼中只考慮了http這種情況,不過我已經email給aren,他已經修復了這個bug。下面我們具體看一下每個屬性的含義,其中ts表示每個樣本結束的Timestamp,s表示請求的狀態,成功為true,失敗為false,lb表示請求的名稱,rc表示請求的response code, rm表示response message,tn表示thread name,dt表示data type, dy表示data byte。通過解析這個xml文本我們可以生成這樣一個請求結果:
通過解析可以得到response time, tps等,還可以生成圖表如下所示:
這個可以看到是請求的表現圖。
Aren在開發Jmeter-analysis-maven-plugin這個插件的時候已經提供了,生成html,cvs, chart幾種方式,我在代碼中增加了一種方式就是將測試結果存入數據庫。
具體大家可以看我后續在github上上傳的代碼。Aren在開發該插件的時候沒有將Tps, VUser這些數據放在報告中,我也在代碼中做了一些修改來展示這些數據。
總而言之使用這個插件可以很方便的來進行性能測試,我們只需要將上一篇blog所提到的關於Jmeter-maven-plugin結合本篇文章所提到的Jmeter-analysis-maven-plugin結合起來使用便可以方便的構建各種測試場景,我們只需要在pom.xml中進行如下配置:
<plugin> <groupId>${project.groupId}</groupId> <artifactId>jmeter-maven-plugin</artifactId> <version>${project.version}</version> <!-- configure different executions of the plugin --> <executions> <execution> <!-- 1) first test run warms up the webserver. Used to fill caches. With a different set of properties since it runs much shorter than a normal test and also the rate of requests/second may be much lower. Maybe also use a different URL set. --> <id>warmup</id> <phase>integration-test</phase> <goals> <goal>jmeter</goal> </goals> <configuration> <propertiesUser> <!--Accesses urls for warmup (compiles JSPs, fills caches, ...)--> <threadgroup00.name>warmup</threadgroup00.name> <!--number of threads to use--> <threadgroup00.numberOfThreads>1</threadgroup00.numberOfThreads> <!--delay of the test in seconds--> <threadgroup00.scheduledDelay>0</threadgroup00.scheduledDelay> <!--duration of the test in seconds--> <threadgroup00.scheduledDuration>30</threadgroup00.scheduledDuration> <!--how long till all threads are up and running in seconds--> <threadgroup00.rampUp>1</threadgroup00.rampUp> <!--target throughput of all threads of the group per minute--> <!-- <threadgroup00.throughput>100000000</threadgroup00.throughput>--> <!-- use uris from given file --> <!-- <threadgroup00.dataFile>${webapp.uris}</threadgroup00.dataFile> --> </propertiesUser> </configuration> </execution> <execution> <!-- 2) Performance test --> <id>test</id> <phase>integration-test</phase> <goals> <goal>jmeter</goal> </goals> <configuration> <propertiesUser> <!--A user which accesses all URLs--> <threadgroup00.name>posc</threadgroup00.name> <!--number of threads to use--> <threadgroup00.numberOfThreads>30</threadgroup00.numberOfThreads> <!--number of loops--> <threadgroup00.numberOfLoops>2</threadgroup00.numberOfLoops> <!--delay of the test in seconds--> <threadgroup00.scheduledDelay>0</threadgroup00.scheduledDelay> <!--duration of the test in seconds--> <threadgroup00.scheduledDuration>30</threadgroup00.scheduledDuration> <!--how long till all threads are up and running in seconds--> <threadgroup00.rampUp>2</threadgroup00.rampUp> <!--target throughput of all threads of the group per minute--> <!-- <threadgroup00.throughput>100000000</threadgroup00.throughput>--> <!-- use uris from given file --> <!-- <threadgroup00.dataFile>${webapp.uris}</threadgroup00.dataFile>--> </propertiesUser> </configuration> </execution> </executions> <!-- general configuration for all executions --> <configuration> <!-- configure which testplans to use --> <testFilesIncluded> <testFilesIncluded>PoscPaymentServiceImplService.jmx</testFilesIncluded> </testFilesIncluded> <!-- protocol, server and port of tested webapp --> <propertiesUser> <protocol>${webapp.protocol}</protocol> <server>${webapp.host}</server> <port>${webapp.port}</port> </propertiesUser> </configuration> </plugin> <plugin> <groupId>${project.groupId}</groupId> <artifactId>jmeter-analysis-maven-plugin</artifactId> <version>${jmeter.analysis.maven.plugin.version}</version> <executions> <execution> <goals> <goal>analyze</goal> </goals> <phase>post-integration-test</phase> <configuration> <!-- source file that contains jmeter result data. Needs to be XML format or a GZIPed XML format --> <source>${project.build.directory}/jmeter/results/PoscPaymentServiceImplService-120613.jtl</source> <!-- directory where to store analysis report files. At least a file "summary.txt" will be stored here. --> <targetDirectory>${project.build.directory}/reports</targetDirectory> <!-- Defines groups of requests by URL patterns, e.g. URIs starting with /mock/page are associated with group "pages". All analysis results are If there is no such mapping then the threadgroups from the jmeter.xml are used. --> <!--<requestGroups>--> <!--<test>/en-US/firefox/**</test>--> <!--</requestGroups>--> <!-- If set to true, additional files "<category>-sizes.csv" and "<category>-durations.csv" will be stored. These files contain detailed information for response size and response durations for every URI. --> <generateCSVs>true</generateCSVs> <!-- If set to true, additional chart files "<category>-durations.png" will be created. --> <generateCharts>true</generateCharts> <!-- The database configuration --> <userName>xxx</userName> <passWord>xxx</passWord> <dataBase>xxx</dataBase> <host>xxx.xxx.xxx.xxx:3306</host> <!-- Mapping from resource URL to file name. Every resource will be downloaded and stored in 'targetDirectory' with the given filename. Tokens "_FROM_" and "_TO_" can be used as placeholders. These placeholders will be replaced by timestamps of execution interval (formatted as ISO8601, e.g. '20111216T145509+0100'). --> <!--<remoteResources>--> <!--<property>--> <!--<name>http://yourhost/path?from=_FROM_&to=_TO_</name>--> <!--<value>my_resource.txt</value>--> <!--</property>--> <!--</remoteResources>--> </configuration> </execution> </executions> </plugin>
便可以完成一個測試場景,關於具體每一個element,這里不做詳細解釋,因為在注解中已經寫的很詳細了。關於如何配合CI構建雲測試平台將在下一篇blog中繼續闡述。