неділя, 18 березня 2012 р.

Формируем отчет о полной загрузке страницы

Задача:
Написать сценарий который будет загружать страницу со всем внутреним фаршем. В отчете отобразить суммарное время загрузки страницы со статикой.
Цель: 
Проверить скорость загрузки страниц на клиентской стороне при большой нагрузке

Теоретическая часть:
Загрузка страницы в бразер стостоит из нескольких запросов:
  • сама страница (HTML), 
  • картинки (PNG, JPEG, JPG, GIF, BMP), 
  • файлы разметки (CSS), 
  • файлы клиентского JavaScript (JS), 
  • другие об'экты (flash, video, audio, etc) 
Сценарий: 
Записывается запрос для самой страницы. В нем с помощью Post-Processor выкусывается вся статика. Дальше в цикле выполняем запросы по всем статическим ресурсам.
Все результаты сохраняются как XML файл.

Проблемы: 
1) Как идентифицыровать, что статика принадлежит именно нашему запросу
2) Как сгруппировать запросы в отчете.

Решение: 
1) Используем Parametrised Controller + Module Controller для отправки запроса. Параметры: название страницы, протокол, URL страницы, GET, POST. Название страницы добавляем к названию запроса в статике
2) Пишем следующее XSL преобразование:
<xsl:template name="create-pagelist">
            <xsl:for-each
                select="/testResults/*[not(@lb = preceding::*/@lb) and not(contains(@lb , '.jpg') or contains(@lb, '.png') or contains(@lb, '.gif') or contains(@lb, '.css') or contains(@lb, '.js'))]">
                <xsl:variable name="uniqueLabel" select="@lb"/>

                <uniquelist><xsl:attribute name="lb"><xsl:value-of select="@lb" /></xsl:attribute>

                <xsl:for-each select="/testResults/*">
                    <xsl:if test="starts-with(@lb, $uniqueLabel)">
                        <value>
                            <xsl:attribute name="lb"><xsl:value-of select="@lb" /></xsl:attribute>
                            <xsl:attribute name="t"><xsl:value-of select="@t"/></xsl:attribute>
                            <xsl:attribute name="ts"><xsl:value-of select="@ts"/></xsl:attribute>
                            <xsl:attribute name="s"><xsl:value-of select="@s"/></xsl:attribute>
                            <xsl:attribute name="tn"><xsl:value-of select="@tn"/></xsl:attribute>
                            <xsl:attribute name="by"><xsl:value-of select="@by"/></xsl:attribute>
                            <xsl:attribute name="rc"><xsl:value-of select="@rc"/></xsl:attribute>
                            <xsl:attribute name="rs"><xsl:value-of select="@rs"/></xsl:attribute>
                            <xsl:attribute name="rm"><xsl:value-of select="@rm"/></xsl:attribute>
                            <assertionResult><failureMessage><xsl:value-of select="assertionResult/failureMessage" /></failureMessage></assertionResult>
                            <binary><xsl:value-of select="binary" /></binary>
                        </value>
                    </xsl:if>
                </xsl:for-each>
                </uniquelist>
            </xsl:for-each>
    </xsl:template>

Данное преобразование формирует XML ввиде
 <uniquelist lb="/promo/professions">
        <value by="15141" label="/promo/professions" rc="200" rm="OK" rs="" s="true" t="2535" tn="Scenario 1 1-5" ts="1330891472753">
            <assertionresult>
                <failuremessage>
            </failuremessage></assertionresult>
            <binary>
        </binary></value>
        <value by="55290" label="/promo/professions - /resources/styles/client.new/style2.css?v=634653478841984398" rc="200" rm="OK" rs="" s="true" t="462" tn="Scenario 1 1-15" ts="1330891485595">
            <assertionresult>
                <failuremessage>
            </failuremessage></assertionresult>
            <binary>
        </binary></value>
        <value by="923" label="/promo/professions - /resources/images/client.new/soc-vk-s.png" rc="200" rm="OK" rs="" s="true" t="269" tn="Scenario 1 1-2" ts="1330891485861">
            <assertionresult>
                <failuremessage>
            </failuremessage></assertionresult>
            <binary>
        </binary></value>
    </uniquelist>



Но для формирования отчета нам понадобится еще одно XSLT преобразование:


<xsl:template name="pagelist">

        <h2>Pages</h2>
        <table class="details" border="0" cellpadding="5" cellspacing="2"
            width="95%">
            <tr valign="top">
                <th>URL</th>
                <th>Requests count</th>
                <th>Failures</th>
                <th>Success Rate</th>
                <th>Average Time</th>
                <th>Min Time</th>
                <th>Max Time</th>
            </tr>

            <xsl:for-each select="uniquelist">
                <xsl:variable name="label" select="@lb" />
                <xsl:variable name="count" select="count(value)" />
                <xsl:variable name="failureCount"
                    select="count(value[attribute::s='false'])" />
                <xsl:variable name="successCount"
                    select="count(value[attribute::s='true'])" />
                <xsl:variable name="successPercent" select="$successCount div $count" />
                <xsl:variable name="totalTime" select="sum(value/@t)" />
                <xsl:variable name="averageTime" select="$totalTime div $count" />
                <xsl:variable name="minTime">
                    <xsl:call-template name="min">
                        <xsl:with-param name="nodes" select="value/@t" />
                    </xsl:call-template>
                </xsl:variable>
                <xsl:variable name="maxTime">
                    <xsl:call-template name="max">
                        <xsl:with-param name="nodes" select="value/@t" />
                    </xsl:call-template>
                </xsl:variable>
                <tr valign="top">
                    <xsl:attribute name="class">
                    <xsl:choose>
                        <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
                    </xsl:choose>
                </xsl:attribute>
                    <td>
                        <xsl:if test="$failureCount > 0">
                            <a>
                                <xsl:attribute name="href">#<xsl:value-of
                                    select="$label" /></xsl:attribute>
                                <xsl:value-of select="$label" />
                            </a>
                        </xsl:if>
                        <xsl:if test="0 >= $failureCount">
                            <xsl:value-of select="$label" />
                        </xsl:if>
                    </td>
                    <td>
                        <xsl:value-of select="$count" />
                    </td>
                    <td>
                        <xsl:value-of select="$failureCount" />
                    </td>
                    <td>
                        <xsl:call-template name="display-percent">
                            <xsl:with-param name="value" select="$successPercent" />
                        </xsl:call-template>
                    </td>
                    <td>
                        <xsl:call-template name="display-time">
                            <xsl:with-param name="value" select="$averageTime" />
                        </xsl:call-template>
                    </td>
                    <td>
                        <xsl:call-template name="display-time">
                            <xsl:with-param name="value" select="$minTime" />
                        </xsl:call-template>
                    </td>
                    <td>
                        <xsl:call-template name="display-time">
                            <xsl:with-param name="value" select="$maxTime" />
                        </xsl:call-template>
                    </td>
                  </tr>
            </xsl:for-each>
        </table>
    </xsl:template>





Итого результат будет в следующем ввиде:
(Я упустил секции для формирования Summary, но я думаю читател сможет догадатся как их реализовать по аналогии)



Немає коментарів:

Дописати коментар