티스토리 뷰

- 먼저 설치를 진행합니다.
아래 링크를 통해 설치해도 좋고, mac 사용자의 경우 homebrew를 통해 쉽게 설치할 수 있습니다.

압축을 풀면, bin 폴더에 jmeter.sh 파일과 jmeter.bat 파일이 있습니다.
윈도우는 bat, 맥은 sh를 통해서 실행 가능합니다.

https://jmeter.apache.org/download_jmeter.cgi

 

Apache JMeter - Download Apache JMeter

Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava

jmeter.apache.org


- homebrew를 통해 설치한 경우, 아래의 명령어를 통해 Jmeter를 실행합니다.

(인텔)
open /usr/local/bin/jmeter

(m1)
open /opt/homebrew/bin/Jmeter

명령어를 입력하면, 터미널에 이런 창이 나오고 Jmeter가 실행이 됩니다

- Jmeter 실행

처음 실행했을 때

 

실제 사용할 때에는 이런 느낌?



Test Plan
 -> 테스트 시나리오 전체를 관장하는 것. 글로벌하게 적용할 환경변수들을 여기서 적용하면 좋다.
Thread Group -> 하나의 시나리오. 회원이 로그인을 해서 물건을 주문하는 것이 하나의 시나리오라면, 이 플로우를 묶어놓는 것이다.

Sampler -> 하나의 api 단위. 각각 로그인, 상품 주문 이런식으로 등록해서 사용할 수 있다.

각각의 설정들은 Test Plan을 우클릭해서 추가할 수 있습니다.

 


- 테스트 시나리오 생각해보기
이번에 제가 제작할 테스트 시나리오는 
유저 로그인 -> 선착순 이벤트 참여입니다.

이를 위해서는 여러 회원들의 로그인이 필요하고, 테스트에서 로그인이 진행되었을 때 발급되는 토큰을 계속 물고 있어야 합니다.

그렇다면 먼저 로그인 테스트를 할 때 여러 회원들이 로그인 하는 상황을 만들어야 합니다.

저는 csv를 활용하려고 합니다.

 

저는 자바를 사용해서 아래처럼
tester1, abcd1234?

tester2, abcd1234?

..

이렇게 생성되는 csv 파일을 만들었습니다.

어짜피 비밀번호가 똑같은데 굳이 왜 생성했는지는 모르겠네요 ..ㅎ 아무 생각없이 하는 게 이렇게 무섭습니다. 

package com.project.stress_traffic_system.event;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class tester {
    public static void main(String[] args) {

        String csvFile = "/Users/yuhyeonseung/Desktop/file.csv";
        FileWriter writer = null;

        try {
            writer = new FileWriter(csvFile);


            // CSV 데이터 작성
            List<List<String>> data = new ArrayList<>();


            int length = 51;

            for (int i = 1; i < length; i++) {
                data.add( Arrays.asList("tester" + i, "abcd1234?"));
            }

            //위에서 추가된 애들에서 안에 들어있는 elements를 하나의 string으로 묶되 ,로 구분하고 개행
            for (List<String> row : data) {
                String rowStr = String.join(",", row);
                writer.write(rowStr + "\n");
            }

            System.out.println("CSV file created successfully!");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

- 시나리오 작성하기 (BlazeMeter 사용)

다음은 시나리오 작성입니다.

물론 하나하나 시나리오를 작성해도 되는데 몹시 귀찮습니다..

테스트 시나리오 자체가 간단한 분들은 아래 이미지들처럼 Thread group 생성하고 HTTP request sampler 생성하셔서
직접 api 등록하셔서 사용하셔도 됩니다.

 

이게 사실 한 두개정도면 간단한데 여러 상황이라면 너무 귀찮고 할 것도 많습니다.

그래서 저는 BlazeMeter라는 크롬 확장프로그램을 사용하고자 합니다.

전 이미 받아놨습니당

저는 이미 실행했기에 이미지가 없지만, 
확장프로그램을 클릭하면 sign up을 할 수 있는 탭이 있습니다.
sign up을 진행해 주시면 됩니다.

 

이후 테스트 시나리오를 적용하고 싶은 사이트에 접속하고 BlazeMeter를 클릭합니다.

이후 사용법은 간단한데, 

녹화 버튼을 누르고 테스트 하고 싶은 시나리오대로 진행하시고 정지 버튼을 누르면 됩니다.

이런 식으로 기록됩니다

기록이 완료되면 edit을 눌러봅니다.

 

위와 같은 창이 뜨는데, 내가 사용한 api가 제대로 기록되었는지 확인해 봅시다.

문제 없다면 위에 .jmx 버튼을 눌러 export합니다.

 

이제 Jmeter에서 저장한 jmx파일을 불러옵니다.

file - open으로 열어주시면 됩니다.

 

파일을 열면 아래처럼 열리는 것을 확인할 수 있습니다.
(로그인 / 선착순은 제가 임의로 이름을 변경했습니다. 원래는 api 주소로 네이밍되어있습니다.)

 

- 생성된 csv 파일 넣기

(이전 이미지와 다르지만 차이는 없습니다)
CSV Data Set Config를 추가합니다.


설정은 아래 이미지와 같습니다.

file name은 제작한 csv를 지정해 주시면 되고,

file encoding은 utf-8 (다른 방식을 선택하셔도 무방하나, 저는 그냥 널리 쓰이고 기본으로 사용되는 utf-8을 사용합니다)

 

variable name이 중요한데, csv를 작성한 순서대로 변수명을 지정하는 것입니다.
예를 들어, 저는 csv파일을 생성할 때  username, password의 순서로 제작했습니다.

(tester1, abcd123! 이런 식으로 작성했었는데, id와 비밀번호의 순서입니다.)

csv를 저와 같은 양식으로 제작하였다면, 다른 설정에서 추가로 바꿀 필요는 없습니다.

 


-Listener 생성

테스트 결과를 확인하기 위한 listener를 추가해 줍시다.

 

Summary report -> 테스트 내용을 요약해서 보여줍니다. 

View result tree -> request header , response header, body 값 등을 확인 가능합니다.

Graph results -> 테스트 결과를 그래프 형태로 확인합니다.

 

- csv 활용해서 로그인 실행 

이제 로그인에 해당하는 HTTP request sampler를 클릭해서 body값을 입력해 줍니다.

 

아까 csv설정을 할때 설정한 변수를 활용합니다.

저의 경우는 username / password로 변수를 설정했기 때문에 ${username}이라고 값을 넣어줍니다.

(비밀번호는 어짜피 값이 똑같아서 그냥 뒀습니다.)

이렇게 하면 csv 파일 안에 있는 데이터를 활용해서 로그인을 진행합니다.

다만 이대로 테스트를 진행하면 각 로그인들이 유지되지 않는 문제가 있습니다.

 

저는 로그인 상태를 유지시키기 위해 reponse로 내려온 토큰을 변수로 저장해 다음 api에서 활용하는 방식을 사용하려고 합니다.

 

 

위 의 이미지처럼 Regular Expression Extractor를 추가합니다.

 

저의 경우에는 토큰이 response header에 이런식으로 들어옵니다.

이렇게 내려오는 토큰을 정규식을 통해서 인식시키고, 그 값을 저장해서 사용할 예정입니다.

이제 regular expression extractor를 클릭하고 위와 같이 값을 채워 넣습니다.

Name of created variable -> 변수로 사용할 이름입니다.

Regular Expression ->  어떤 값을 변수의 value로 지정할 것인지를 정규식을 통해서 설정합니다. 위 이미지의 경우 Authorization: Bearer 로 시작하는 경우를 가져와 bearer뒤의 숫자를 저장합니다.
template -> 정규식을 사용해서 특정 문자열 패턴을 찾을 때, 패턴 내에서 괄호를 사용해서 여러 개의 그룹을 나눌 수 있습니다.

 

예를 들어 아래와 같은 문자열에서 숫자만 뽑아내고 싶다고 한다면

This is an example string containing numbers 1234 and 5678.

 

regular expression 에 아래와 같이 쓸 수 있습니다.

numbers (\d+) and (\d+)

이러면 각 괄호를 그룹으로 인식하기 때문에
$1$면 첫번째 괄호, $2$면 두번째 괄호를 말하게 됩니다.


rf.
https://www.blazemeter.com/blog/jmeter-regular-expressions-extractor

 

JMeter Regular Expression Extractor: How to Extract Tokens and Session IDs to Variables | Blazemeter by Perforce

When tokens and session IDs are sent in the request header, sometimes they need to be worked with as variables. Learn how to use the JMeter regular expression extractor to make it easy.

www.blazemeter.com

 

이제 토큰이 필요한 api의 헤더에 토큰을 추가해 줍니다.

위의 이미지처럼 변수를 사용해서 토큰을 사용할 수 있습니다.

-테스트 진행

 

Number of Threads -> 사용자 수를 말합니다.

 

Ramp -up period -> 스레드가 증가하는 시간 간격을 말함.

예를 들어 스레드(사용자)가 100개이고 ramp-up period가 10초이면, 1초마다 10개씩 스레드를 추가합니다.

이 시간이 너무 짧으면 트래픽 증가가 너무 과하게 들어가고 너무 길면 오히려 시스템 과부하를 방지할 수 있습니다.

 

loop count -> 각 스레드가 이 테스트 요청을 몇 번 실행할 지를 정합니다. infinite를 체크하면 계속 실행합니다. 1로 설정하면 각 스레드가 한 번만 실행하고 더이상 실행하지 않습니다.

 

-실행 결과 확인

저는 일단 기본 세팅으로 동작 확인을 해 보았습니다.

로그인도 잘물고 잘 응답합니다

이렇게 Jmeter를 사용해서 내 서버가 얼마만큼 버틸 수 있는지 테스트를 간단하게 살펴봤습니다.

댓글