๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์•ˆ๋…•, ํ•˜๋ธŒ๋ฅด! ์ด๊ฑด ๋‚ด ํ›„์†ํŽธ์ด์•ผ ์ด์ „ ๊ฐ„ํ–‰๋ฌผ, JMeter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๊ธฐ์—ด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ์˜ต์…˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ ์—ฐ๋ฐฉ ํšŒ์‚ฌ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋ฒ„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์š”์ฒญ ํ˜•์‹, ๋ณ€ํ™˜, ๋ณต์žกํ•œ ๋ผ์šฐํŒ…. ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋Œ€๊ธฐ์—ด์— ๋งŽ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์ฒ™์ถ”์ง€์••์‚ฌ๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ณ ํ†ต์ž…๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์†Œ๊ฐœ

์ฒ˜์Œ์—๋Š” ์ด ๊ณ ํ†ต์„ ์ฐธ์•„์•ผ ํ–ˆ์ง€๋งŒ. ๋ชจ๋“  ๊ฒƒ์€ RFHUtil์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์–ด์ƒ‰ํ•˜๊ณ  ๋ฌด์„ญ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋‹น์‹ ์€ Rus๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ•„์ˆ˜ ๋ถˆ๊ฐ€๊ฒฐํ•˜์ง€๋งŒ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊พธ์ค€ํžˆ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
ํŽธ๋ฆฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

JMeter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋งˆ์Šคํ„ฐ๋ง ๋‹จ๊ณ„์™€ ์ต์ˆ™ํ•ด์ง„ ํ›„์— ํ–‰๋ณตํ•œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ํฌ๋ง์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” JMS ๊ฒŒ์‹œ์ž ๋ฐ JMS ๊ตฌ๋…์ž ์ƒ˜ํ”Œ๋Ÿฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JMS Point-to-Point์™€ ๋‹ฌ๋ฆฌ ์ด ์Œ์€ ์‚ฌ์šฉํ•˜๊ธฐ ๋” ํŽธ๋ฆฌํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, JMS Selector์˜ Subscriber๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Point-to-Point์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ด ๋ฐฉ๋ฒ•์€ ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์ƒ˜ํ”Œ๋Ÿฌ ์ค€๋น„

JMS ๊ฒŒ์‹œ์ž

  • ์„ค์ • - ๊ฐ ์ƒ˜ํ”Œ. ์•„ํŒŒ์น˜ ์ถ”์ฒœํ•˜๋‹ค ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ์—ด/์ฃผ์ œ๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋งŒ๋ฃŒ(ms) = 120000. ์‹คํŒจํ•  ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์š”์ฒญ์€ 2๋ถ„ ํ›„์— ๋Œ€๊ธฐ์—ด์—์„œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ๋น„์ง€์†์  ์ „๋‹ฌ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? - ์ง„์‹ค. IBM ์Šน์ธํ•˜๋‹คํ•ด๋‹น ์ง€์† ๋ชจ๋“œ๋Š” ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๋น„์ง€์† ๋ชจ๋“œ์—์„œ๋Š” ๋” ๋น ๋ฅธ ๊ตํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ชฉ์ ์—์„œ๋Š” ์†๋„๊ฐ€ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ฒŒ์‹œ์ž์—์„œ ๊ตฌ๋…์ž๊ฐ€ JMS ์„ ํƒ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  jms ์†์„ฑ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ํ…Œ์ŠคํŠธ ๊ณ„ํš ์š”์†Œ์— ์ž„์˜์˜ ๊ฐ’์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ๊ตฌ์„ฑ๋œ JMS ๊ฒŒ์‹œ์ž์˜ ๋งˆ์ง€๋ง‰ "๊ณต๋ฐฑ":

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

JMS ๊ตฌ๋…์ž

  • ์„ค์ • - ๊ฐ ์ƒ˜ํ”Œ. ๊ธ€์Ž„, ๋‹น์‹ ์€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ•œ ์‹œ๊ฐ„(ms) = 100000. 100์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•œ ํ›„์—๋„ ์š”์ฒญ์ด ๋Œ€๊ธฐ์—ด์— ๋„์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ƒ˜ํ”Œ ์‚ฌ์ด์— ์ค‘์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? - ์ง„์‹ค.

JMS ์„ ํƒ๊ธฐ - ๋งค์šฐ ํŽธ๋ฆฌํ•จ ์กฐ๊ฐ. ์ตœ์ข… JMS ๊ฐ€์ž…์ž:

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์ „์†ก๋œ ๋ฉ”์‹œ์ง€์—์„œ ํ‚ค๋ฆด ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. JMeter์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ต์ • ํ›„ ์‚๋šค๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•˜๊ณ  ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์œ„๋Œ€ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฒƒ์„ ์ฆ๊ธฐ๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. JMeter "์‹คํ–‰๊ธฐ"์— JVM ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    -Dfile.encoding=UTF-8
  2. ๊ทธ๋ฃจ๋น„ ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋…์ž์— JSR223 PostProcessor๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    prev.setDataEncoding("UTF-8")

๋ฌธ์ž๋ฅผ ๋ณด๋‚ด๋‹ค

๊ฐ€์žฅ ๊ฒŒ์œผ๋ฅธ ์˜ต์…˜. ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ตœ์†Œํ•œ ์ž‘์€ ๊ฒƒ์„ ๋ณด๋‚ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. ์˜ต์…˜์„ ์„ ํƒํ•˜์„ธ์š” ๋ฉ”์‹œ์ง€ ์†Œ์Šค - ํ…์ŠคํŠธ ์˜์—ญ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์„ ํ…์ŠคํŠธ ๋ธ”๋ก์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

ํŒŒ์ผ ์ „์†ก

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์„ ์„ ํƒํ•˜์„ธ์š” ๋ฉ”์‹œ์ง€ ์†Œ์Šค - ํŒŒ์ผ์—์„œ ํ•„๋“œ์— ๋ฉ”์‹œ์ง€ ๊ฒฝ๋กœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ - ํŒŒ์ผ ์ด๋ฆ„:

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

ํŒŒ์ผ์„ ํ…์ŠคํŠธ ํ•„๋“œ๋กœ ์ „์†กํ•˜๊ธฐ

๊ฐ€์žฅ ๋‹ค์–‘ํ•œ ์˜ต์…˜. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉ + ๋‘ ๋ฒˆ์งธ ์ „์†ก ์˜ต์…˜์ด ์—†๋Š” JMS ์ง€์  ๊ฐ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

๋ฐ”์ดํŠธ ๋ฐฐ์—ด ์ „๋‹ฌ

๊ฐ€์žฅ ์–ด๋ ค์šด ์˜ต์…˜. ์™œ๊ณก, SMS ๋ฐ ๊ต๋ž€ ์—†์ด ์š”์ฒญ์˜ ๋ฐ”์ดํŠธ๊นŒ์ง€ ์ •ํ™•ํ•˜๊ณ  ์ •ํ™•ํ•œ ์ „์†ก์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ JMeter์—์„œ๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ•ด์•ผ ํ–ˆ์–ด์š” ์ถœ์ฒ˜ ์ˆ˜์ •ํ•˜๊ณ  ์•”ํ˜ธ JMS ๊ฐ€์ž…์ž.

๋ฉ”์„œ๋“œ์—์„œ ๋Œ€์ฒด๋จ extractContent(..) ์„ :

buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");

on :

byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
	buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
	throw new RuntimeException(e);
}

JMeter๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚จ์€ ๊ฒƒ์€ JSR223 ์ƒ˜ํ”Œ๋Ÿฌ ๋ช‡ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๊ฒŒ์‹œ์ž/๊ตฌ๋…์ž ์Œ ์ด์ „์— ์ž„์˜ ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋œ DAT ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import org.apache.commons.lang3.RandomUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
        try {
            FileOutputStream fos = new FileOutputStream(RESULT_FILE);
            fos.write(arr);
            fos.close();
        } catch (IOException e) {
            System.out.println("file not found");
        }

๋‘ ๋ฒˆ์งธ - ์Šคํฌ๋ฆฝํŠธ ๋์—์„œ ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

import java.io.File;

File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();

๊ทธ๋ฆฌ๊ณ  Publisher์—์„œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

๋˜ํ•œ JSR223 Assertion for Subscriber์— ๋Œ€ํ•œ ํ™•์ธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ”์ดํŠธ๋ฅผ ์ˆ˜์‹ ์ž์˜ ๋Œ€๊ธฐ์—ด์— ๋„์ฐฉํ•˜๋Š” ๋ฐ”์ดํŠธ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;

Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);

if (Arrays.equals(originalArray, changedArray))
	{
     	SampleResult.setResponseMessage("OK");

	} else {
	   SampleResult.setSuccessful(false);
     	   SampleResult.setResponseMessage("Comparison failed");
	   SampleResult.setResponseData("Bytes have changed","UTF-8");
     	   IsSuccess=false;
	}

๊ฒฐ๋ก 

์‹ค์ œ๋กœ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ํ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ๊ท€ํ•˜์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ํ•œ์ชฝ ๋์—๋Š” ํ๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ชฝ ๋์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์žˆ๋Š” ๊ตํ™˜์„ ํ…Œ์ŠคํŠธํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜์„ธ์š”. ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๋ฐ JMeter: ๊ฒŒ์‹œ์ž ๋ฐ ๊ตฌ๋…์ž์™€ ๊ณต์œ 

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€