Terheléstesztek tervezése Apache JMeter használatával
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:
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.
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.
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
egyeshttpSample
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.