Terheléstesztek tervezése Apache JMeter használatával

Befejeződött

Ebben a szakaszban megismerheti a terheléstesztelést, és megtudhatja, hogyan adhat hozzá terheléses teszteket a folyamathoz. A terheléstesztek Apache JMeter használatával szimulálják a webalkalmazást egyszerre elérő felhasználókat. A tesztek lekérik a webes tartalmat a Azure-alkalmazás Szolgáltatáson futó alkalmazásból az átmeneti környezetben.

Tim azzal kezdi, hogy egy laptopon hozza létre az Apache JMeter felhasználói felületét. Egy alapszintű teszttervet futtat. Ezután Tim és Mara exportálja a teszttervet egy olyan fájlba, amely futtatható a parancssorból. Végül feladatokat adnak hozzá az Azure Pipelineshoz a terhelési tesztek futtatásához az előkészítés során.

Feljegyzés

A rövidség kedvéért nem kell telepítenie az Apache JMeter-et a helyi számítógépre. Egyszerűen elolvashatja.

Terheléstesztek futtatása az Apache JMeterből

Az Apache JMeter egy nyílt forráskódú terheléstesztelő eszköz, amely elemzi és méri a teljesítményt. A létrehozott jelentés egy XML-fájl.

Az Azure Pipelines elolvashatja az Apache JMeter-jelentést, és létrehozhat egy gráfot. Ezeknek a teszteknek a futtatásához nincs szükség speciális hardverre, így a Microsoft által üzemeltetett ügynökkel futtathatja őket. A Space Game-forgatókönyvben ezeket a teszteket valószínűleg az Előkészítésben futtatná.

A tesztterv létrehozása

Így néz ki az Apache JMeter linuxos laptopon:

Screenshot of the Apache JMeter user interface.

Létre kell hoznia egy új teszttervfájlt; például LoadTest.jmx. Ezután hozzáadhat egy szálcsoportot a fájlhoz. Minden szimulált felhasználó saját szálon fut. A szálcsoport szabályozza a felhasználók számát és az egyes felhasználók kéréseinek számát.

Az alábbi példa 10 szimulált felhasználót (szálat) mutat be. Minden felhasználó 10 kérést küld, így a rendszer összesen 100 kérést kap.

Screenshot of specifying the thread group in Apache JMeter.

A mintavevő a JMeter egyetlen kérése. A JMeter HTTP, FTP, TCP és számos más protokollon keresztül képes lekérdezni a kiszolgálókat. A mintavevők a jelentéshez hozzáadott eredményeket generálják.

A következő lépésben a http-kérés alapértelmezett beállításait és egy HTTP-kérelem mintavevőt adna hozzá a szálcsoporthoz. Meg kell adnia annak a Space Game webhelynek a gazdanevét, amely a Azure-alkalmazás Szolgáltatás átmeneti környezetében fut.

Screenshot that shows specifying the HTTP request in Apache JMeter.

Az előző forgatókönyv létrehoz egy alapszintű teszttervet.

A tesztterv futtatása

A JMeter számos teszt futtatását teszi lehetővé. A teszttervet a JMeter grafikus felhasználói felületéről is futtathatja. A terheléses tesztek esetében azonban a JMeter dokumentációja azt javasolja, hogy futtassa a teszttervet a parancssorból.

A teszttervet a következő paranccsal futtatná:

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

Az -n argumentum azt határozza meg, hogy a JMeter nem GRAFIKUS módban fusson. Az -t argumentum a LoadTest.jmx teszttervfájlt adja meg. Az -o argumentum a jelentésfájlt adja meg, Results.xml.

A JMeter futtatja és létrehozza a jelentésfájlt, Results.xml. Ez a példa a fájlra az első néhány találatot mutatja be:

<?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>

Minden minta létrehoz egy csomópontot a jelentésben. Az t attribútum ezredmásodpercben (ms) adja meg a válaszidőt. Itt három kérelem jelenik meg, amelyek 180 ms, 174 ms és 160 ms-ot vettek igénybe.

Az ideális kérelemidőnek egy másodpercnél kevesebbnek kell lennie. A kérelmek legfeljebb 10 százaléka tarthat egy másodpercnél tovább. A JMeter konfigurálható olyan statisztikák jelentésére, mint a minimális, maximális és átlagos válaszidő vagy szórás. Írhat egy szkriptet, amely segít megadni ezeket az információkat.

A teszteredmények megjelenítéséhez meg kell adnia őket az Azure Pipelines által megértett formátumban. Az Azure Pipelines elemezheti a teszteredményeket tartalmazó XML-fájlokat, de a fájlnak támogatott formátumban kell lennie. A támogatott formátumok közé tartozik a CTest, a JUnit (beleértve a PHPUnitot), az NUnit 2, az NUnit 3, a Visual Studio Test (TRX) és az xUnit 2. Írhat egy XSLT-fájlt, amely A JMeter-eredményeket JUnit-ra konvertálja.

A jelentés átalakítása JUnit-ra

Az XSLT az XSL-átalakításokat vagy az eXtensible Stylesheet Language Transformationst jelenti. Az XSLT-fájlok egy XML-fájlhoz hasonlítanak, de lehetővé teszik az XML-dokumentumok más XML-formátumba való átalakítását.

Emlékezzen vissza a terheléses tesztekre vonatkozó követelményekre:

  • Az átlagos kérelemidőnek egy másodpercnél rövidebbnek kell lennie.
  • A kérelmek legfeljebb 10 százaléka tarthat egy másodpercnél tovább.

A követelményeknek megfelelő XSLT-fájlok a következőképpen néznek ki:

<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>

Nem fogjuk részletezni, hogyan működik itt az XSL. Összefoglalva azonban ez a fájl először a következő adatokat gyűjti a JMeter kimenetéből:

  • Minden HTTP-kérés ideje.

    Ezeket az adatokat úgy gyűjti össze, hogy kiválasztja az attribútumot az t egyes httpSample elemek közül. (./httpSample/@t)

  • Minden hibaüzenet.

    Ezeket az adatokat a dokumentum összes failureMessage csomópontjának kiválasztásával gyűjti össze. (./httpSample/assertionResult/failureMessage)

Az XSLT-fájl a küszöbértéket is 1000 ms-ra állítja. Ez a válaszidő a korábban definiált maximális idő.

Ezen változók alapján az XSLT-fájl megadja a tesztek teljes számát és a hibák teljes számát. Ezután a következő két tesztesetet biztosítja:

  • Az átlagos válaszidő és a hiba, ha az átlag meghaladja az 1000 ms-os küszöbértéket.
  • A maximális válaszidő és hiba, ha a kérelmek több mint 10 százaléka meghaladja az 1000 ms-os küszöbértéket.

Az XSLT eredménye megegyezik a JUnit formátummal, amelyet az Azure Pipelines megért. Az XSLT-fájl neve JMeter2JUnit.xsl.

Ezután XSLT-processzorra lesz szüksége. Ebben a példában az xsltprocot használjuk, amely egy parancssori eszköz, amellyel XSLT-stíluslapok alkalmazhatók XML-dokumentumokra.

Az xsltproc telepítése az alábbiak szerint lehetséges:

sudo apt-get install xsltproc

Ezután az xsltproc futtatásával átalakítja a JMeter-jelentést JUnit-ra:

xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml

Az eredményül kapott JUnit-fájl 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>

Ebben a példában az átlagos válaszidő 170 ms. A maximális válaszidő 373 ms. Egyik teszteset sem okoz hibát, mert mindkét esetben az 1000 ms-os küszöbérték alá esik.

Rövidesen ezeket a teszteket a folyamatban fogja futtatni. A JMeter által írt Results.xml olyan köztes fájlként tekinthet, amelyet nem tettek közzé a folyamat teszteredményei között. JUnit.xml a végső jelentésfájl. Ez a fájl közzé lesz téve a folyamaton, hogy a csapat megjeleníthesse az eredményeket.