Apache JMeter kullanarak yük testlerini planlama

Tamamlandı

Bu bölümde yük testini keşfedecek ve işlem hattına yük testi eklemeyi öğreneceksiniz. Yük testleri, web uygulamasına aynı anda erişen birden çok kullanıcının benzetimini yapmak için Apache JMeter kullanır. Testler, Hazırlama ortamındaki Azure Uygulaması Hizmeti üzerinde çalışan uygulamadan web içeriğini getirir.

Tim, dizüstü bilgisayarda Apache JMeter kullanıcı arabirimini getirerek başlar. Temel bir test planı yürütüyor. Ardından Tim ve Mara, test planını komut satırından çalıştırılabilir bir dosyaya dışarı aktarır. Son olarak, Hazırlama sırasında yük testlerini çalıştırmak için Azure Pipelines'a görevler ekler.

Not

Kısa olması için yerel bilgisayarınıza Apache JMeter yüklemeniz gerekmez. Sadece okumaya devam edebilirsiniz.

Apache JMeter'dan yük testleri çalıştırma

Apache JMeter, performansı analiz eden ve ölçen bir açık kaynak yük testi aracıdır. Oluşturduğu rapor bir XML dosyasıdır.

Azure Pipelines, Apache JMeter raporunu okuyabilir ve bir graf oluşturabilir. Bu testleri çalıştırmak için özel bir donanıma ihtiyacınız yoktur, bu nedenle bunları çalıştırmak için Microsoft tarafından barındırılan bir aracı kullanabilirsiniz. Space Game senaryosunda, bu testleri büyük olasılıkla Hazırlama'da çalıştıracaksınız.

Test planını oluşturma

Linux çalıştıran bir dizüstü bilgisayarda Apache JMeter şöyle görünür:

Screenshot of the Apache JMeter user interface.

Yeni bir test planı dosyası oluşturursunuz; örneğin, LoadTest.jmx. Ardından dosyaya bir İş Parçacığı Grubu eklersiniz. Her sanal kullanıcı kendi iş parçacığı üzerinde çalışır. İş parçacığı grubu, kullanıcı sayısını ve her kullanıcının isteklerinin sayısını denetler.

Aşağıdaki örnekte 10 sanal kullanıcı (iş parçacığı) gösterilmektedir. Her kullanıcı 10 istekte bulunur, bu nedenle sistem toplam 100 istek alır.

Screenshot of specifying the thread group in Apache JMeter.

Örnekleyici, JMeter tarafından yapılan tek bir istektir. JMeter sunucuları HTTP, FTP, TCP ve diğer birçok protokol üzerinden sorgulayabilir. Örnekleyiciler rapora eklenen sonuçları oluşturur.

Ardından, iş parçacığı grubuna Http İstek Varsayılanları ve http isteği örnekleyicisi eklersiniz. Azure Uygulaması Hizmeti'ndeki hazırlama ortamında çalışan Space Game web sitesinin ana bilgisayar adını sağlarsınız.

Screenshot that shows specifying the HTTP request in Apache JMeter.

Yukarıdaki senaryo temel bir test planı oluşturur.

Test planını çalıştırma

JMeter, birçok tür test çalıştırmanızı sağlar. Test planınızı JMeter grafik kullanıcı arabiriminden çalıştırabilirsiniz. Ancak, yük testleri için JMeter belgeleri test planını komut satırından çalıştırmanızı önerir.

Şu komutu kullanarak test planını çalıştırırsınız:

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

bağımsız değişkeni, -n JMeter'ın GUI olmayan modda çalıştırılmasını belirtir. -t bağımsız değişkeni, LoadTest.jmx test planı dosyasını belirtir. -o bağımsız değişkeni rapor dosyasını Results.xml belirtir.

JMeter, Results.xml rapor dosyasını çalıştırır ve üretir. Bu dosya örneği ilk birkaç sonucu gösterir:

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

Her örnek raporda bir düğüm oluşturur. t özniteliği, yanıt süresini milisaniye (ms) cinsinden belirtir. Burada 180 ms, 174 ms ve 160 ms süren üç istek görürsünüz.

İdeal istek sürelerinin ortalaması bir saniyeden az olmalıdır. İsteklerin yüzde 10'undan fazlası bir saniyeden fazla sürmemelidir. JMeter'i minimum, maksimum ve ortalama yanıt süreleri veya standart sapma gibi istatistikleri raporlamak için yapılandırabilirsiniz. Bu bilgileri sağlamaya yardımcı olması için bir betik yazabilirsiniz.

Test sonuçlarını görselleştirmek için, bunları Azure Pipelines'ın anladığı bir biçimde sağlamanız gerekir. Azure Pipelines, test sonuçlarını içeren bir XML dosyasını ayrıştırabilir, ancak dosyanın desteklenen bir biçimde olması gerekir. Desteklenen biçimler arasında CTest, JUnit (PHPUnit dahil), NUnit 2, NUnit 3, Visual Studio Test (TRX) ve xUnit 2 bulunur. JMeter sonuçlarını JUnit'e dönüştüren bir XSLT dosyası yazabilirsiniz.

Raporu JUnit'e dönüştürme

XSLT, XSL Dönüşümleri veya Genişletilebilir Stil Sayfası Dil Dönüşümleri anlamına gelir. XSLT dosyası XML dosyasına benzer, ancak bir XML belgesini başka bir XML biçimine dönüştürmenizi sağlar.

Yük testlerine yönelik gereksinimlerimizi hatırlayın:

  • Ortalama istek süresi bir saniyeden kısa olmalıdır.
  • İsteklerin yüzde 10'undan fazlası bir saniyeden fazla sürmemelidir.

Bu gereksinimleri karşılayan bir XSLT dosyası şöyle görünür:

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

Burada XSL'nin nasıl çalıştığını ele almayacağız. Ancak özetlemek gerekirse, bu dosya önce JMeter çıkışından aşağıdaki verileri toplar:

  • Her HTTP isteği zamanı.

    Her httpSample öğeden özniteliğini seçerek t bu verileri toplar. (./httpSample/@t)

  • Her hata iletisi.

    Belgedeki tüm failureMessage düğümleri seçerek bu verileri toplar. (./httpSample/assertionResult/failureMessage)

XSLT dosyası eşik değerini de 1.000 ms olarak ayarlar. Bu yanıt süresi, daha önce tanımladığımız maksimum süredir.

Bu değişkenler göz önüne alındığında, XSLT dosyası toplam test sayısını ve toplam hata sayısını sağlar. Ardından şu iki test çalışması sağlar:

  • Ortalama yanıt süresi ve ortalama 1.000 ms eşiğini aşarsa bir hata.
  • İsteklerin yüzde 10'undan fazlası 1.000 ms eşiğini aşarsa maksimum yanıt süresi ve hata.

XSLT sonuçları, Azure Pipelines'ın anladığı JUnit biçimiyle eşleşmektedir. XSLT dosyanızı JMeter2JUnit.xsl olarak adlandırabilirsiniz.

Ardından bir XSLT işlemciniz olması gerekir. Bu örnekte, XML belgelerine XSLT stil sayfaları uygulamak için bir komut satırı aracı olan xsltproc kullanacağız.

xsltproc'u aşağıdaki gibi yükleyebilirsiniz:

sudo apt-get install xsltproc

Ardından, JMeter raporunu JUnit'e dönüştürmek için xsltproc komutunu çalıştırırsınız:

xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml

Elde edilen JUnit dosyası 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>

Bu örnekte ortalama yanıt süresi 170 ms'dir. Maksimum yanıt süresi 373 ms'dir. Her iki zaman da 1.000 ms eşiğinin altına düştüğünden test çalışması başarısız olmaz.

Kısa bir süre sonra bu testleri işlem hattında çalıştıracaksınız. JMeter'in yazdığı dosya olan Results.xml işlem hattının test sonuçlarında yayımlanmamış bir ara dosya olarak düşünebilirsiniz. JUnit.xml son rapor dosyasıdır. Bu dosya, ekibin sonuçları görselleştirebilmesi için işlem hattında yayımlanır.