Apache JMeter를 사용하여 부하 테스트 계획

완료됨

이 섹션에서는 부하 테스트를 살펴보고 파이프라인에 부하 테스트를 추가하는 방법을 알아봅니다. 부하 테스트에서는 Apache JMeter를 사용하여 웹앱에 동시에 액세스하는 많은 사용자를 시뮬레이션합니다. 테스트는 스테이징 환경의 Azure App Service에서 실행되는 앱에서 웹 콘텐츠를 페치합니다.

Tim은 노트북에서 Apache JMeter 사용자 인터페이스를 가져와 시작합니다. 기본 테스트 계획을 실행합니다. 그런 다음 Tim과 Mara는 테스트 계획을 명령줄에서 실행할 수 있는 파일로 내보냅니다. 마지막으로 준비 중에 부하 테스트를 실행하기 위해 Azure Pipelines에 작업을 추가합니다.

참고

간단히 하기 위해 로컬 컴퓨터에 Apache JMeter를 설치할 필요가 없습니다. 읽어 보기만 하면 됩니다.

Apache JMeter에서 부하 테스트 실행

Apache JMeter는 성능을 분석하고 측정하는 오픈 소스 부하 테스트 도구입니다. 생성하는 보고서는 XML 파일입니다.

Azure Pipelines는 Apache JMeter 보고서를 읽고 그래프를 생성할 수 있습니다. 이러한 테스트를 실행하기 위해 특별한 하드웨어가 필요하지 않으므로 Microsoft 호스팅 에이전트를 사용하여 실행할 수 있습니다. Space Game 시나리오에서는 스테이징에서 이러한 테스트를 실행할 수 있습니다.

테스트 계획 만들기

Linux를 실행하는 랩톱에서 Apache JMeter의 모양은 다음과 같습니다.

Screenshot of the Apache JMeter user interface.

새 테스트 계획 파일을 만듭니다. 예를 들어 LoadTest.jmx입니다. 그런 다음 파일에 스레드 그룹을 추가합니다. 시뮬레이션된 각 사용자는 자체 스레드에서 실행됩니다. 스레드 그룹은 사용자 수와 각 사용자의 요청 수를 제어합니다.

다음 예에서는 10명의 시뮬레이션된 사용자(스레드)를 보여 줍니다. 각 사용자는 10개의 요청을 실행하므로 시스템은 총 100개의 요청을 받습니다.

Screenshot of specifying the thread group in Apache JMeter.

샘플러는 JMeter의 단일 요청입니다. JMeter는 HTTP, FTP, TCP 및 여러 다른 프로토콜을 통해 서버를 쿼리할 수 있습니다. 샘플러에서는 보고서에 추가되는 결과를 생성합니다.

다음으로, Http 요청 기본값Http 요청 샘플러를 스레드 그룹에 추가합니다. Azure 앱 Service의 스테이징 환경에서 실행되는 Space Game 웹 사이트의 호스트 이름을 제공합니다.

Screenshot that shows specifying the HTTP request in Apache JMeter.

이전 시나리오에서는 기본 테스트 계획을 만듭니다.

테스트 계획 실행

JMeter를 사용하면 다양한 종류의 테스트를 실행할 수 있습니다. JMeter 그래픽 사용자 인터페이스에서 테스트 계획을 실행할 수 있습니다. 그러나 부하 테스트의 경우 JMeter 설명서에서는 명령줄에서 테스트 계획을 실행하는 것이 좋습니다.

다음 명령을 사용하여 테스트 계획을 실행합니다.

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

-n 인수는 GUI가 아닌 모드로 JMeter를 실행하도록 지정합니다. -t 인수는 테스트 계획 파일, LoadTest.jmx를 지정합니다. -o 인수는 보고서 파일, Results.xml을 지정합니다.

JMeter가 실행되고 보고서 파일, Results.xml을 생성합니다. 이 파일의 예에서는 처음 몇 가지 결과를 보여 줍니다.

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

각 샘플은 보고서에서 노드를 생성합니다. t 특성은 ms(밀리초) 단위의 응답 시간을 지정합니다. 여기서는 180ms, 174ms 및 160ms가 걸린 세 가지 요청을 볼 수 있습니다.

이상적인 요청 시간은 평균 1초 미만이어야 합니다. 1초 이상 걸리는 요청은 10% 이하여야 합니다. 최소, 최대 및 평균 응답 시간 또는 표준 편차와 같은 통계를 보고하도록 JMeter를 구성할 수 있습니다. 이 정보를 제공하는 데 도움이 되는 스크립트를 작성할 수 있습니다.

테스트 결과를 시각화하려면 Azure Pipelines에서 이해하는 형식으로 제공해야 합니다. Azure Pipelines는 테스트 결과가 포함된 XML 파일을 구문 분석할 수 있지만, 파일은 지원되는 형식이어야 합니다. 지원되는 형식은 CTest, JUnit(PHPUnit 포함), NUnit 2, NUnit 3, Visual Studio Test(TRX) 및 xUnit 2입니다. JMeter 결과를 JUnit으로 변환하는 XSLT 파일을 작성할 수 있습니다.

보고서를 JUnit으로 변환

XSLT는 XSL 변환 또는 XSLT(eXtensible Stylesheet Language Transformations)를 나타냅니다. XSLT 파일은 XML 파일과 비슷하지만, XML 문서를 다른 XML 형식으로 변환할 수 있습니다.

부하 테스트에 대한 요구 사항을 기억하세요.

  • 평균 요청 시간은 1초 미만이어야 합니다.
  • 1초 이상 걸리는 요청은 10% 이하여야 합니다.

이러한 요구 사항을 충족하는 XSLT 파일은 다음과 같습니다.

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

여기서는 XSL의 작동 방식을 자세히 살펴보겠습니다. 요약하자면, 이 파일은 먼저 JMeter 출력에서 ​​다음 데이터를 수집합니다.

  • 각 HTTP 요청 시간.

    httpSample 요소에서 t 특성을 선택하여 이 데이터를 수집합니다. (./httpSample/@t)

  • 각 실패 메시지.

    설명서에서 모든 failureMessage 노드를 선택하여 이 데이터를 수집합니다. (./httpSample/assertionResult/failureMessage)

XSLT 파일은 임계값을 1000ms로 설정합니다. 이 응답 시간은 앞에서 정의한 최대 시간입니다.

이 변수가 지정되면 XSLT 파일에서 총 테스트 수와 총 실패 수를 제공합니다. 그런 다음 두 가지 테스트 사례를 제공합니다.

  • 평균 응답 시간 및 실패(평균이 임계값 1,000ms를 초과하는 경우).
  • 최대 응답 시간 및 실패(10%가 넘는 요청이 임계값 1,000ms를 초과하는 경우).

XSLT의 결과는 Azure Pipelines에서 이해하는 JUnit 형식과 일치합니다. XSLT 파일 JMeter2JUnit.xsl의 이름을 지정할 수 있습니다.

다음으로, XSLT 프로세서가 필요합니다. 이 예제에서는 XSLT 스타일시트를 XML 문서에 적용하기 위한 명령줄 도구인 xsltproc를 사용합니다.

다음과 같이 xsltproc를 설치할 수 있습니다.

sudo apt-get install xsltproc

다음으로 xsltproc를 실행하여 JMeter 보고서를 JUnit으로 변환합니다.

xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml

다음은 결과적으로 생성되는 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>

이 예에서 평균 응답 시간은 170ms입니다. 최대 응답 시간은 373ms입니다. 두 테스트 사례 모두 1,000ms 임계값 아래로 떨어지기 때문에 실패를 생성하지 않습니다.

곧, 파이프라인에서 이 테스트를 실행합니다. JMeter가 작성하는 파일인 Results.xml을 파이프라인의 테스트 결과에 게시되지 않은 중간 파일로 생각할 수 있습니다. JUnit.xml은 최종 보고서 파일입니다. 이 파일은 팀에서 결과를 시각화할 수 있도록 파이프라인에 게시됩니다.