1

私はJMeterで一連のWebサービステストを実行してきましたが、実行したいのは、各テストによって返された平均応答時間の合計を取得することです。各テストの平均応答時間を見つける方法はありますが、テストの平均を合計する方法はありません。XPathのsum()関数を使用するには、値がノードセットの一部である必要があることを認識していますが、XMLから平均値を見つけたら、それらはノードセットの一部ではなくなったことを理解しています。したがって、node-set()関数を使用する必要がありますが、XSLT / XPathはかなり新しく、動作させる方法がわかりません。

これに関するどんな助けもありがたいです!

これは、2回の反復で実行される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>

これは私のXSLTの抜粋であり、各テストの平均が見つかります。

<xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]">
    ...
    <xsl:variable name="count" select="count(../*[@lb = current()/@lb])" />
    <xsl:variable name="totalTime" select="sum(../*[@lb = current()/@lb]/@t)" />
    <xsl:variable name="averageTime" select="$totalTime div $count" />
    ...
</xsl:for-each>

これらの平均時間をノードセットに入力し、その後それらを合計するにはどうすればよいですか?

これは、興味のある人にとっての最終レポートの例です。

前もって感謝します!

4

1 に答える 1

1

XSLT2.0を使用できる場合、これにはノードセットを処理するための組み込み機能がありますが、XSLT1.0では拡張機能を使用する必要があります。ノードセットを使用すると、(新しく作成された)ノードのリストを保持する変数を作成するだけで、ソースドキュメント自体であるかのように、ノードを反復処理したり、合計したりすることができます。

解決策を示す前に注意すべきもう1つの点は、これもグループ化の問題の例であるということです。複数のテストの結果があり、それらを名前でグループ化したいと考えています。現在使用している方法は、必ずしもそれほど効率的ではありません。XSLT2.0には、物事をはるかに簡単にするxsl:for-each-group関数がありますが

<xsl:for-each-group select="httpSample" group-by="@lb">

必要なのは、変数を作成し、テスト結果をグループ化して新しいノードセットを作成し、「平均」ノードを新しいリストに追加することです。

  <xsl:variable name="results">
     <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)"/>
        <test lb="{current-grouping-key()}" num="{$count}" tot="{$totalTime}" avg="{$totalTime div $count}"/>
     </xsl:for-each-group>
  </xsl:variable>

したがって、ここでの結果変数には、個別のテストごとに1つずつ、テスト要素のリストが含まれ、新しく追加されたノードには平均時間が含まれます。次に、これらの結果を繰り返し処理し、合計することもできます。

これが完全なXSLTです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/testResults">

      <xsl:variable name="results">
         <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)"/>
            <test lb="{current-grouping-key()}" num="{$count}" tot="{$totalTime}" avg="{$totalTime div $count}"/>
         </xsl:for-each-group>
      </xsl:variable>

      <table>
         <tr>
            <th>Test</th>
            <th>Total Test</th>
            <th>Total Time</th>
            <th>Average Time</th>
         </tr>
         <xsl:for-each select="$results/test">
            <tr>
               <td>
                  <xsl:value-of select="@lb"/>
               </td>
               <td>
                  <xsl:value-of select="@num"/>
               </td>
               <td>
                  <xsl:value-of select="@tot"/>
               </td>
               <td>
                  <xsl:value-of select="@avg"/>
               </td>
            </tr>
         </xsl:for-each>
         <tr>
            <td>Total</td>
            <td>
               <xsl:value-of select="sum($results/test/@num)"/>
            </td>
            <td>
               <xsl:value-of select="sum($results/test/@tot)"/>
            </td>
            <td>
               <xsl:value-of select="sum($results/test/@avg)"/>
            </td>
         </tr>
      </table>
   </xsl:template>
</xsl:stylesheet>

XMLサンプルに適用すると、次のように出力されます。

<table>
   <tr>
      <th>Test</th>
      <th>Total Test</th>
      <th>Total Time</th>
      <th>Average Time</th>
   </tr>
   <tr>
      <td>html</td>
      <td>2</td>
      <td>78</td>
      <td>39</td>
   </tr>
   <tr>
      <td>userRoleRetriever</td>
      <td>2</td>
      <td>47</td>
      <td>23.5</td>
   </tr>
   <tr>
      <td>UserActivityWSDL</td>
      <td>2</td>
      <td>47</td>
      <td>23.5</td>
   </tr>
   <tr>
      <td>SubscriberMgmtWSDL</td>
      <td>2</td>
      <td>188</td>
      <td>94</td>
   </tr>
   <tr>
      <td>NetworkMgmtWSDL</td>
      <td>2</td>
      <td>62</td>
      <td>31</td>
   </tr>
   <tr>
      <td>AlarmMgmtWSDL</td>
      <td>2</td>
      <td>31</td>
      <td>15.5</td>
   </tr>
   <tr>
      <td>getSubscribers</td>
      <td>2</td>
      <td>391</td>
      <td>195.5</td>
   </tr>
   <tr>
      <td>getMpegResultsById</td>
      <td>2</td>
      <td>15719</td>
      <td>7859.5</td>
   </tr>
   <tr>
      <td>getOverallSummary</td>
      <td>2</td>
      <td>30</td>
      <td>15</td>
   </tr>
   <tr>
      <td>Total</td>
      <td>18</td>
      <td>16593</td>
      <td>8296.5</td>
   </tr>
</table>
于 2012-06-05T14:29:47.787 に答える