Plánování zátěžových testů pomocí Apache JMeter

Dokončeno

V této části prozkoumáte zátěžové testování a dozvíte se, jak do kanálu přidat zátěžové testy. Zátěžové testy používají Apache JMeter k simulaci více uživatelů, kteří přistupují k webové aplikaci současně. Testy načítají webový obsah z aplikace, která běží ve službě Aplikace Azure Service v přípravném prostředí.

Tim začíná vyvoláním uživatelského rozhraní Apache JMeter na přenosném počítači. Spustí základní testovací plán. Pak Tim a Mara vyexportují testovací plán do souboru, který se dá spustit z příkazového řádku. Nakonec do Azure Pipelines přidají úlohy, které spustí zátěžové testy během přípravy.

Poznámka:

Pro stručnost nemusíte instalovat Apache JMeter na místní počítač. Můžete si jen přečíst.

Spouštění zátěžových testů z Apache JMeter

Apache JMeter je opensourcový nástroj pro zátěžové testování, který analyzuje a měří výkon. Sestava, kterou generuje, je soubor XML.

Azure Pipelines může číst sestavu Apache JMeter a generovat graf. Ke spuštění těchto testů nepotřebujete žádný speciální hardware, abyste je mohli spustit pomocí agenta hostovaného Microsoftem. Ve scénáři Space Game byste pravděpodobně tyto testy spustili v přípravném prostředí.

Vytvoření testovacího plánu

Apache JMeter vypadá na přenosném počítači s Linuxem takto:

Screenshot of the Apache JMeter user interface.

Vytvořili byste nový soubor testovacího plánu; Například LoadTest.jmx. Potom byste do souboru přidali skupinu vláken. Každý simulovaný uživatel běží ve vlastním vlákně. Skupina vláken řídí počet uživatelů a počet požadavků jednotlivých uživatelů.

Následující příklad ukazuje 10 simulovaných uživatelů (vláken). Každý uživatel provede 10 požadavků, takže systém získá celkem 100 požadavků.

Screenshot of specifying the thread group in Apache JMeter.

Sampler je jeden požadavek vytvořený JMeterem. JMeter může dotazovat servery přes PROTOKOL HTTP, FTP, TCP a několik dalších protokolů. Vzorkovníky generují výsledky přidané do sestavy.

Dále byste do skupiny vláken přidali výchozí hodnoty požadavku HTTP a sampler požadavku HTTP. Zadali byste název hostitele webu Space Game, který běží v přípravném prostředí ve službě Aplikace Azure Service.

Screenshot that shows specifying the HTTP request in Apache JMeter.

Předchozí scénář vytvoří základní testovací plán.

Spuštění testovacího plánu

JMeter umožňuje spouštět mnoho druhů testů. Testovací plán je možné spustit z grafického uživatelského rozhraní JMeter. Pro zátěžové testy však dokumentace JMeter doporučuje spustit testovací plán z příkazového řádku.

Testovací plán byste spustili pomocí tohoto příkazu:

apache-jmeter-5.4.1/bin/./jmeter -n -t LoadTest.jmx -o Results.xml

Argument -n určuje spuštění JMeter v režimu bez grafického uživatelského rozhraní. Argument -t určuje soubor testovacího plánu LoadTest.jmx. Argument -o určuje soubor sestavy Results.xml.

JMeter spustí a vytvoří soubor sestavy Results.xml. Tento příklad souboru ukazuje několik prvních výsledků:

<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample t="180" it="0" lt="95" ct="35" ts="1569306009772" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40871" sby="144" ng="1" na="1">
  <java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="174" it="0" lt="96" ct="38" ts="1569306009955" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40869" sby="144" ng="1" na="1">
  <java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="160" it="0" lt="121" ct="35" ts="1569306010131" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40879" sby="144" ng="2" na="2">
  <java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>

Každá ukázka vytvoří uzel v sestavě. Atribut t určuje dobu odezvy v milisekundách (ms). Tady vidíte tři žádosti, které trvaly 180 ms, 174 ms a 160 ms.

Ideální doba požadavků by měla být průměrně menší než jedna sekunda. Maximálně 10 procent požadavků by nemělo trvat déle než jednu sekundu. JMeter můžete nakonfigurovat tak, aby hlásil statistiky, jako je minimum, maximum a průměrná doba odezvy nebo směrodatná odchylka. Mohli byste napsat skript, který vám pomůže tyto informace poskytnout.

Pokud chcete vizualizovat výsledky testu, musíte je zadat ve formátu, kterému Azure Pipelines rozumí. Azure Pipelines může analyzovat soubor XML, který obsahuje výsledky testu, ale soubor musí být v podporovaném formátu. Mezi podporované formáty patří CTest, JUnit (včetně PHPUnit), NUnit 2, NUnit 3, Visual Studio Test (TRX) a xUnit 2. Můžete napsat soubor XSLT, který převede výsledky JMeter na JUnit.

Transformace sestavy na JUnit

XSLT je zkratka pro transformace XSL nebo eXtensible Stylesheet Language Transformations. Soubor XSLT se podobá souboru XML, ale umožňuje transformovat dokument XML do jiného formátu XML.

Připomeňte si naše požadavky na zátěžové testy:

  • Průměrná doba žádosti by měla být menší než jedna sekunda.
  • Maximálně 10 procent požadavků by nemělo trvat déle než jednu sekundu.

Takto vypadá soubor XSLT, který splňuje tyto požadavky:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
  <xsl:template match="/testResults">
    <xsl:variable name="times" select="./httpSample/@t" />
    <xsl:variable name="failures" select="./httpSample/assertionResult/failureMessage" />
    <xsl:variable name="threshold" select="1000" />
    <testsuite>
      <xsl:attribute name="tests"><xsl:value-of select="count($times)" /></xsl:attribute>
      <xsl:attribute name="failures"><xsl:value-of select="count($failures)" /></xsl:attribute> 
      <testcase>
          <xsl:variable name="avg-time" select="sum($times) div count($times)" />
          <xsl:attribute name="name">Average Response Time</xsl:attribute>
          <xsl:attribute name="time"><xsl:value-of select="format-number($avg-time div 1000,'#.##')"/></xsl:attribute>
          <xsl:if test="$avg-time > $threshold">
            <failure>Average response time of <xsl:value-of select="format-number($avg-time,'#.##')"/> exceeds <xsl:value-of select="$threshold"/> ms threshold.</failure>
          </xsl:if> 
      </testcase>
      <testcase>
          <xsl:variable name="exceeds-threshold" select="count($times[. > $threshold])" />
          <xsl:attribute name="name">Max Response Time</xsl:attribute>
          <xsl:attribute name="time"><xsl:value-of select="math:max($times) div 1000"/></xsl:attribute>
          <xsl:if test="$exceeds-threshold > count($times) * 0.1">
            <failure><xsl:value-of select="format-number($exceeds-threshold div count($times) * 100,'#.##')"/>% of requests exceed <xsl:value-of select="$threshold"/> ms threshold.</failure>
          </xsl:if>
      </testcase>
    </testsuite>
  </xsl:template>
</xsl:stylesheet>

Nebudeme se zabývat tím, jak tady funguje XSL. Tento soubor ale nejprve shromažďuje následující data z výstupu JMeter:

  • Čas každého požadavku HTTP.

    Shromažďuje tato data výběrem atributu t z každého httpSample prvku. (./httpSample/@t)

  • Každá zpráva o selhání.

    Tato data shromažďuje výběrem všech failureMessage uzlů z dokumentu. (./httpSample/assertionResult/failureMessage)

Soubor XSLT také nastaví prahovou hodnotu na 1 000 ms. Tato doba odezvy je maximum, které jsme definovali dříve.

Vzhledem k těmto proměnným poskytuje soubor XSLT celkový počet testů a celkový počet selhání. Pak poskytuje tyto dva testovací případy:

  • Průměrná doba odezvy a selhání, pokud průměr překročí prahovou hodnotu 1 000 ms.
  • Maximální doba odezvy a selhání, pokud více než 10 procent požadavků překročí prahovou hodnotu 1 000 ms.

Výsledky XSLT odpovídají formátu JUnit, kterému Azure Pipelines rozumí. Můžete pojmenovat váš soubor XSLT JMeter2JUnit.xsl.

V dalším kroku budete potřebovat procesor XSLT. V tomto příkladu použijeme xsltproc, což je nástroj příkazového řádku pro použití šablon stylů XSLT na dokumenty XML.

Xsltproc můžete nainstalovat následujícím způsobem:

sudo apt-get install xsltproc

Dále byste spustili xsltproc , abyste transformoval sestavu JMeter na JUnit:

xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml

Tady je výsledný soubor JUnit, JUnit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:math="http://exslt.org/math" tests="100" failures="0">
  <testcase name="Average Response Time" time="0.17"/>
  <testcase name="Max Response Time" time="0.373"/>
</testsuite>

V tomto příkladu je průměrná doba odezvy 170 ms. Maximální doba odezvy je 373 ms. Ani jeden testovací případ nevygeneruje chybu, protože oba časy spadají pod prahovou hodnotu 1 000 ms.

Za chvíli tyto testy spustíte v kanálu. Můžete uvažovat o Results.xml, souboru, který JMeter zapisuje, jako zprostředkující soubor, který není publikovaný ve výsledcích testu kanálu. JUnit.xml je konečný soubor sestavy. Tento soubor se publikuje do kanálu, aby tým mohl vizualizovat výsledky.