我一直在JMeter中运行一系列的webservice测试,我一直在做的是修改我的结果报告,以包括每个测试返回的平均响应时间的总和。但我还需要做的是将平均次数的总和加起来直到某次测试。有没有办法可以修改XSLT来计算每个测试的测试平均值,除了测试“X”和之后的测试?例如磅= “getSubscribers”?
Here is what the results report typically looks like.基本上我想将“平均时间”列的内容从“http”测试加到“AlarmMgmtWSDL”测试中。
这是来自JMeter的XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../style/jmeter-results-detail-report_21.xsl"?>
<testResults version="1.2">
<httpSample t="78" lt="78" ts="1338826079163" s="true" lb="html" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="4418" ng="1" na="1"/>
<httpSample t="31" lt="31" ts="1338826079241" s="true" lb="userRoleRetriever" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="758" ng="1" na="1"/>
<httpSample t="32" lt="32" ts="1338826079272" s="true" lb="UserActivityWSDL" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="2398" ng="1" na="1"/>
<httpSample t="156" lt="125" ts="1338826079304" s="true" lb="SubscriberMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="56434" ng="1" na="1"/>
<httpSample t="31" lt="16" ts="1338826079460" s="true" lb="NetworkMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="33020" ng="1" na="1"/>
<httpSample t="15" lt="15" ts="1338826079507" s="true" lb="AlarmMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="11594" ng="1" na="1"/>
<httpSample t="141" lt="141" ts="1338826079538" s="true" lb="getSubscribers" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="397" ng="1" na="1"/>
<httpSample t="265" lt="234" ts="1338826079679" s="true" lb="getMpegResultsById" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="832927" ng="1" na="1"/>
<httpSample t="15" lt="15" ts="1338826079976" s="true" lb="getOverallSummary" rc="200" rm="OK" tn="vuserver 1-1" dt="text" by="402" ng="1" na="1"/>
<httpSample t="0" lt="0" ts="1338826082663" s="true" lb="html" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="4418" ng="1" na="1"/>
<httpSample t="16" lt="16" ts="1338826082663" s="true" lb="userRoleRetriever" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="758" ng="1" na="1"/>
<httpSample t="15" lt="0" ts="1338826082679" s="true" lb="UserActivityWSDL" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="2398" ng="1" na="1"/>
<httpSample t="32" lt="0" ts="1338826082694" s="true" lb="SubscriberMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="56434" ng="1" na="1"/>
<httpSample t="31" lt="15" ts="1338826082726" s="true" lb="NetworkMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="33020" ng="1" na="1"/>
<httpSample t="16" lt="16" ts="1338826082757" s="true" lb="AlarmMgmtWSDL" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="11594" ng="1" na="1"/>
<httpSample t="250" lt="250" ts="1338826082788" s="true" lb="getSubscribers" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="10536" ng="1" na="1"/>
<httpSample t="15454" lt="15392" ts="1338826083038" s="true" lb="getMpegResultsById" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="2023426" ng="1" na="1"/>
<httpSample t="15" lt="15" ts="1338826098555" s="true" lb="getOverallSummary" rc="200" rm="OK" tn="vuserver 1-2" dt="text" by="402" ng="1" na="1"/>
</testResults>
我需要使用该XML的前X个测试结果,排除其余部分,同时在第二次迭代时保留测试结果的X个数,这样我就可以得到平均值。 / p>
这是我的xslt的摘录,它找到了测试平均值的总和:
<xsl:variable name="totalAverageTime">
<xsl:for-each-group select="httpSample" group-by="@lb">
<xsl:variable name="count" select="count(current-group())" />
<xsl:variable name="totalTime" select="sum(current-group()/@t)" />
<average avg="{$totalTime div $count}" />
</xsl:for-each-group>
</xsl:variable>
<tr>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="sum($totalAverageTime/average/@avg)" />
</xsl:call-template>
</td>
</tr>
有关如何使用这些特定测试的任何想法?非常感谢帮助!
答案 0 :(得分:2)
有几种方法可以做到这一点。首先,您可以在 xsl:for-each-group 中添加 xsl:if 语句,以便仅输出前7个分组元素。换句话说,它会在进行分组时考虑所有测试结果,但只输出前7个不同的结果。
<xsl:variable name="totalAverageTime">
<xsl:for-each-group select="httpSample" group-by="@lb">
<xsl:if test="position() <= 7">
<xsl:variable name="count" select="count(current-group())" />
<xsl:variable name="totalTime" select="sum(current-group()/@t)" />
<average avg="{$totalTime div $count}" />
</xsl:if>
</xsl:for-each-group>
</xsl:variable>
或者,您仍然可以使用所有测试结果构建 $ totalAverageTime ,但只需限制自己查看输出它们的前七个。
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="sum($totalAverageTime/average[position() <= 7]/@avg)" />
</xsl:call-template>
后一种方法可能更灵活,因为如果需要,您仍然可以获得完整的结果。
答案 1 :(得分:1)
请在XSLT文档中使用Xpath 2.0。
使用像“child
”这样的斧头和position()
'snode测试你得到了你的兄弟子集:
/testResults/child::httpSample[position() lt 5]
给你的第一个兄弟姐妹哪个位置小于5:你会得到你的前4个兄弟姐妹。
通常你会得到
/testResults/child::httpSample[position() lt (X+1)]
X是您希望选择的第一个兄弟姐妹的数量。
因为'AlarmMgmtWSDL'
是第6个元素的lb
属性,所以你得到了
/testResults/child::httpSample[position() lt 7]
只需像这样更改变量“totalAverageTime
”:
<xsl:variable name="totalAverageTime">
<xsl:for-each-group select="httpSample[position() lt 7]" group-by="@lb">
<xsl:variable name="count" select="count(current-group())"/>
<xsl:variable name="totalTime" select="sum(current-group()/@t)"/>
<average avg="{$totalTime div $count}"/>
</xsl:for-each-group>
</xsl:variable>