16. 모범 사례

16.1 항상 최신 버전의 JMeter 사용

JMeter의 성능은 지속적으로 개선되고 있으므로 사용자는 최신 버전을 사용하는 것이 좋습니다. 새로운 개선 사항 및 구성 요소를 인식
하려면 항상 변경 사항 목록 을 읽으십시오. 마지막 버전보다 3개 이전 버전을 사용하는 것은 절대 피해야 합니다.

16.2 올바른 스레드 수 사용

하드웨어 기능과 테스트 계획 설계는 모두 JMeter로 효과적으로 실행할 수 있는 스레드 수에 영향을 미칩니다. 숫자는 또한 서버의 속도에 따라 달라집니다(서버가 빠를수록 응답을 더 빨리 반환하므로 JMeter가 더 열심히 작동합니다). 다른 부하 테스트 도구와 마찬가지로 스레드 수의 크기를 올바르게 지정하지 않으면 잘못되거나 부정확한 결과를 제공할 수 있는 "Coordinated Omission" 문제에 직면하게 됩니다. 대규모 부하 테스트가 필요한 경우 분산 모드(또는 사용하지 않음)를 사용하여 여러 시스템에서 여러 CLI JMeter 인스턴스를 실행하는 것을 고려하십시오. 분산 모드를 사용할 때 결과 파일은 컨트롤러 노드에서 결합되며, 여러 자율 인스턴스를 사용하는 경우 후속 분석을 위해 샘플 결과 파일을 결합할 수 있습니다. JMeter가 주어진 플랫폼에서 어떻게 수행되는지 테스트하기 위해, JavaTest 샘플러를 사용할 수 있습니다. 네트워크 액세스가 필요하지 않으므로 달성 가능한 최대 처리량에 대한 아이디어를 얻을 수 있습니다.

JMeter에는 스레드가 샘플링을 시작할 때까지, 즉 스레드 그룹 지연 및 스레드 자체에 대한 램프업 시간 후까지 스레드 생성을 지연하는 옵션이 있습니다. 너무 많은 스레드가 동시에 활성화되지 않는 한 매우 많은 총 스레드 수를 허용합니다.

16.3 쿠키 관리자의 위치

자세한 내용 은 웹 테스트 구축을 참조하십시오 .

16.4 권한 부여 관리자를 배치할 위치

자세한 내용 은 고급 웹 테스트 구축을 참조 하십시오.

16.5 HTTP(S) 테스트 스크립트 레코더 사용하기

레코더 설정에 대한 자세한 내용 은 HTTP(S) 테스트 스크립트 레코더 를 참조하십시오. 가장 중요한 것은 관심이 없는 모든 요청을 걸러내는 것입니다. 예를 들어, 이미지 요청을 기록하는 것은 의미가 없습니다(JMeter는 페이지의 모든 이미지를 다운로드하도록 지시받을 수 있습니다 - HTTP 요청 참조 ). 이것들은 테스트 계획을 복잡하게 만들 것입니다. 대부분의 경우 .jsp , .asp , .php , .html 등과 같이 모든 파일이 공유하는 확장자가 있습니다. " .*\.jsp "를 "포함 패턴"으로 입력하여 " 포함 " 해야 합니다.

또는 " .*\.gif "를 "Exclude Pattern" 으로 입력하여 이미지를 제외할 수 있습니다 . 애플리케이션에 따라 이것이 더 나은 방법일 수도 있고 아닐 수도 있습니다. 스타일시트, 자바스크립트 파일 및 기타 포함된 파일을 제외해야 할 수도 있습니다. 설정을 테스트하여 원하는 것을 녹음하고 있는지 확인한 다음 지우고 새로 시작하십시오.

HTTP(S) 테스트 스크립트 레코더는 HTTP 요청을 기록할 기록 컨트롤러가 있는 ThreadGroup 요소를 찾을 것으로 예상합니다. 이렇게 하면 테스트 케이스를 설명하는 이름을 지정할 수 있는 하나의 컨트롤러 아래에 모든 샘플을 편리하게 패키징할 수 있습니다.

이제 테스트 케이스의 단계를 진행하십시오. 사전 정의된 테스트 케이스가 없는 경우 JMeter를 사용하여 테스트 케이스를 정의하기 위한 조치를 기록하십시오. 일련의 단계를 완료했으면 전체 테스트 케이스를 적절한 이름의 파일에 저장합니다. 그런 다음 깨끗이 닦고 새로운 테스트 케이스를 시작하십시오. 이렇게 하면 많은 수의 테스트 케이스 "초안"을 빠르게 기록할 수 있습니다.

HTTP(S) 테스트 스크립트 레코더의 가장 유용한 기능 중 하나는 기록된 샘플에서 특정 공통 요소를 추출할 수 있다는 것입니다. 테스트 계획 수준 또는 사용자 정의 변수 요소에서 일부 사용자 정의 변수 를 정의하여 JMeter가 기록된 샘플의 값을 자동으로 바꾸도록 할 수 있습니다. 예를 들어 " xxx.example.com " 서버에서 앱을 테스트하는 경우 " xxx.example.com " 값을 사용하여 " server " 라는 변수를 정의할 수 있으며 해당 값이 기록된 파일에서 발견되는 모든 위치 샘플은 " ${server} " 로 대체됩니다 .

일치는 대소문자를 구분합니다.

JMeter가 샘플을 기록하지 않으면 브라우저가 실제로 프록시를 사용하고 있는지 확인하십시오. JMeter가 실행되고 있지 않아도 브라우저가 정상적으로 작동하면 브라우저가 프록시를 사용할 수 없습니다. 일부 브라우저는 localhost 또는 127.0.0.1 에 대한 프록시 설정을 무시합니다 . 대신 로컬 호스트 이름이나 IP를 사용해 보십시오.

" unknown_ca " 오류 는 아마도 HTTPS를 기록하려고 시도하고 브라우저가 JMeter 프록시 서버 인증서를 수락하지 않았음을 의미합니다.

16.6 사용자 변수

일부 테스트 계획은 다른 사용자/스레드에 대해 다른 값을 사용해야 합니다. 예를 들어, 각 사용자에 대해 고유한 로그인이 필요한 시퀀스를 테스트할 수 있습니다. 이것은 JMeter가 제공하는 기능으로 쉽게 달성할 수 있습니다.

예를 들어:

  • 쉼표로 구분된 사용자 이름과 암호가 포함된 텍스트 파일을 만듭니다. 이것을 테스트 계획과 동일한 디렉토리에 넣으십시오.
  • 테스트 계획에 CSV DataSet 구성 요소를 추가합니다. 변수 이름을 USERPASS 로 지정 합니다.
  • 적절한 샘플러 에서 로그인 이름을 ${USER} 로, 비밀번호를 ${PASS} 로 바꿉니다.

CSV 데이터 세트 요소는 각 스레드에 대해 새 행을 읽습니다.

16.7 리소스 요구 사항 줄이기

리소스 사용량을 줄이기 위한 몇 가지 제안.

  • CLI 모드 사용: jmeter -n -t test.jmx -l test.jtl
  • 가능한 한 적은 수의 리스너를 사용하십시오. 위와 같이 -l 플래그를 사용하면 모두 삭제되거나 비활성화될 수 있습니다.
  • 부하 테스트 중에 "결과 트리 보기" 또는 "테이블에서 결과 보기" 리스너를 사용하지 말고 스크립트를 디버그하기 위해 스크립팅 단계에서만 사용하십시오.
  • 유사한 샘플러를 많이 사용하는 것보다 루프에서 동일한 샘플러를 사용하고 변수(CSV 데이터 세트)를 사용하여 샘플을 변경합니다. [Include Controller는 테스트 계획에 파일의 모든 테스트 요소를 추가하므로 여기에서 도움이 되지 않습니다.]
  • 기능 모드를 사용하지 마십시오
  • XML 대신 CSV 출력 사용
  • 필요한 데이터만 저장
  • 가능한 한 적은 수의 Assertion을 사용하십시오.
  • 가장 성능이 좋은 스크립팅 언어 사용(JSR223 섹션 참조)

테스트에 많은 양의 데이터가 필요한 경우(특히 무작위로 추출해야 하는 경우) CSV 데이터 세트로 읽을 수 있는 파일에 테스트 데이터를 만듭니다. 이렇게 하면 런타임에 리소스가 낭비되는 것을 방지할 수 있습니다.

16.8 BeanShell 서버

BeanShell 인터프리터에는 매우 유용한 기능이 있습니다. 텔넷이나 http로 액세스할 수 있는 서버 역할을 할 수 있습니다.

보안이 없습니다. 포트에 연결할 수 있는 사람은 모든 BeanShell 명령을 실행할 수 있습니다. 이들은 JMeter 애플리케이션과 호스트에 대한 무제한 액세스를 제공할 수 있습니다. 포트가 예를 들어 방화벽에 의해 액세스로부터 보호되지 않는 한 서버를 활성화하지 마십시오.

서버를 사용하려면 jmeter.properties 에서 다음을 정의하십시오 .

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh

위의 예에서 서버가 시작되고 포트 90009001 에서 수신 대기합니다 . 포트 9000 은 http 액세스에 사용됩니다. 포트 9001 은 텔넷 액세스에 사용됩니다. startup.bsh 파일 은 서버에서 처리되며, 다양한 기능을 정의하고 변수를 설정하는 데 사용할 수 있습니다. 시작 파일은 JMeter 및 시스템 속성을 설정하고 인쇄하는 방법을 정의합니다. 이것은 JMeter 콘솔에서 볼 수 있는 것입니다:

시작 스크립트 실행 중
시작 스크립트 완료
Httpd가 포트에서 시작됨: 9000
포트에서 시작된 세션: 9001

서버를 테스트하는 데 사용할 수 있는 샘플 스크립트( extras/remote.bsh )가 있습니다. [작동 방법을 보려면 살펴보십시오.] JMeter bin
디렉토리 에서 시작할 때 (다른 곳에서 실행하는 경우 필요에 따라 경로 조정) 출력은 다음과 같아야 합니다.

$ java -jar ../lib/bshclient.jar 로컬 호스트 9000 ../extras/remote.bsh
localhost:9000에서 BSH 서버에 연결
서버에서 응답을 읽는 중…
BeanShell 2.0b5 - Pat Niemeyer 작성(pat@pat.net)
bsh % remote.bsh 시작
user.home = C:\Documents and Settings\User
user.dir = D:\eclipseworkspaces\main\JMeter_trunk\bin
'EXAMPLE' 속성을 '0'으로 설정합니다.
속성 'EXAMPLE'을 '1'로 설정합니다.
속성 'EXAMPLE'을 '2'로 설정합니다.
속성 'EXAMPLE'을 '3'으로 설정합니다.
'EXAMPLE' 속성을 '4'로 설정합니다.
속성 'EXAMPLE'을 '5'로 설정합니다.
속성 'EXAMPLE'을 '6'으로 설정합니다.
'EXAMPLE' 속성을 '7'로 설정합니다.
속성 'EXAMPLE'을 '8'로 설정합니다.
속성 'EXAMPLE'을 '9'로 설정합니다.
예 = 9
remote.bsh 종료
bsh % ... 서버에서 연결이 끊어졌습니다.

실용적인 예로 CLI 모드에서 실행 중인 JMeter 테스트가 오래 실행되고 테스트 중 다양한 시간에 처리량을 변경하려고 한다고 가정합니다. 테스트 계획에는 ${__P(throughput)} 와 같은 속성으로 정의되는 일정한 처리량 타이머가 포함됩니다 . 다음 BeanShell 명령을 사용하여 테스트를 변경할 수 있습니다.

printprop("처리량");
curr = Integer.decode(args[0]); // 시작 값
inc = Integer.decode(args[1]); // 증가
끝 = Integer.decode(args[2]); // 최종 값
초 = Integer.decode(args[3]); // 변경 사이에 대기
동안(현재 <= 끝) {
  setprop("처리량",curr.toString()); // 여기에 문자열이 있어야 합니다.
  Thread.sleep(초*1000);
  커 += Inc;
}
printprop("처리량");

스크립트는 파일( 예: 처리량 .bsh)에 저장하고 bshclient.jar 을 사용하여 서버로 보낼 수 있습니다. 예를 들어:

java -jar ../lib/bshclient.jar 로컬 호스트 9000 처리량.bsh 70 5 100 60

16.9 BeanShell 스크립팅

JMeter 3.1부터 BeanShell에서 JSR223 테스트 요소로 전환하고(자세한 내용은 아래 JSR223 섹션 참조) __Beanshell 기능에서 __groovy 기능으로 전환하는 것이 좋습니다 .

16.9.1 개요

각 BeanShell 테스트 요소에는 고유한 인터프리터 사본이 있습니다(각 스레드에 대해). 테스트 요소가 반복적으로 호출되는 경우(예: 루프 내에서) " Reset bsh.Interpreter before each call " 옵션이 선택되지 않는 한 인터프리터는 호출 사이에 유지됩니다.

일부 장기 실행 테스트로 인해 인터프리터가 많은 메모리를 사용할 수 있습니다. 이 경우 재설정 옵션을 사용해 보십시오.

명령줄 인터프리터를 사용하여 JMeter 외부에서 BeanShell 스크립트를 테스트할 수 있습니다.

$ java -cp bsh-xxx.jar[;필요에 따라 다른 jar] bsh.Interpreter file.bsh [매개변수]
또는
$ java -cp bsh-xxx.jar bsh.Interpreter
bsh% 소스("파일.bsh");
bsh% 종료(); // 또는 EOF 키 사용(예: ^Z 또는 ^D)

16.9.2 변수 공유

변수는 시작(초기화) 스크립트에서 정의할 수 있습니다. 재설정 옵션을 사용하지 않는 한 테스트 요소를 호출하는 동안 유지됩니다.

스크립트는 " vars " 변수의 get()put() 메서드를 사용하여 JMeter 변수에 액세스할 수도 있습니다 . 예를 들면 다음과 같습니다.

vars.get("호스트");
vars.put("MSG","성공");
get()put() 메서드는 String 값 이 있는 변수만 지원하지만 임의의 객체에 사용할 수 있는 getObject()putObject() 메서드도 있습니다. JMeter 변수는 스레드에 로컬이지만 Beanshell뿐만 아니라 모든 테스트 요소에서 사용할 수 있습니다.

스레드 간에 변수를 공유해야 하는 경우 JMeter 속성을 사용할 수 있습니다.

org.apache.jmeter.util.JMeterUtils 가져오기;
문자열 값 = JMeterUtils.getPropDefault("이름","");
JMeterUtils.setProperty("이름", "값");
샘플 .bshrc 파일에는 getprop()setprop() 메서드의 샘플 정의가 포함되어 있습니다.

변수를 공유하는 또 다른 방법은 " bsh.shared " 공유 네임스페이스를 사용하는 것입니다. 예를 들어:

if (bsh.shared.myObj == 무효){
    // 아직 정의되지 않았으므로 다음을 생성합니다.
    myObj = 새로운 AnyObject();
}
bsh.shared.myObj.process();
테스트 요소에서 객체를 생성하는 대신 JMeter 속성 " beanshell.init.file "로 정의된 시작 파일에서 생성할 수 있습니다. 이것은 한 번만 처리됩니다.

16.10 Groovy나 Jexl3 등에서 스크립트 기능 개발하기

스크립트를 함수로 작성하고 테스트하는 것은 상당히 어렵습니다. 그러나 JMeter에는 JSR223 샘플러가 있어 이를 지원하는 모든 언어와 함께 대신 사용할 수 있습니다. Apache Groovy 또는 JSR223의 Compilable 인터페이스 를 지원하는 모든 언어를 사용 하는 것이 좋습니다.

JSR223 샘플러 및 트리 보기 리스너를 포함하는 간단한 테스트 계획을 작성하십시오. 샘플러 스크립트 창에서 스크립트를 코딩하고 테스트를 실행하여 테스트합니다. 오류가 있으면 트리 보기 및 jmeter.log 파일에 표시됩니다. 또한 스크립트 실행 결과가 응답으로 표시됩니다.

스크립트가 제대로 작동하면 테스트 계획에 변수로 저장할 수 있습니다. 그런 다음 스크립트 변수를 사용하여 함수 호출을 생성할 수 있습니다. 예를 들어 Groovy 스크립트가 RANDOM_NAME 변수에 저장되어 있다고 가정합니다 . 그런 다음 함수 호출을 ${__groovy(${RANDOM_NAME})} 로 코딩할 수 있습니다 . 변수 값이 보간되기 전에 함수 호출이 구문 분석되기 때문에 스크립트에서 쉼표를 이스케이프할 필요가 없습니다.

16.11 매개변수화 테스트

종종 다른 설정으로 동일한 테스트를 다시 실행할 수 있는 것이 유용합니다. 예를 들어, 스레드 또는 루프의 수를 변경하거나 호스트 이름을 변경합니다.

이를 수행하는 한 가지 방법은 테스트 계획에서 변수 집합을 정의한 다음 테스트 요소에서 해당 변수를 사용하는 것입니다. 예를 들어, 변수 LOOPS=10 을 정의 하고 스레드 그룹에서 ${LOOPS} 로 참조할 수 있습니다. 20개의 루프로 테스트를 실행하려면 테스트 계획에서 LOOPS 변수 값을 변경하기만 하면 됩니다.

CLI 모드에서 많은 테스트를 실행하려는 경우 이는 빠르게 지루해집니다. 이에 대한 한 가지 솔루션은 속성 측면에서 테스트 계획 변수를 정의하는 것입니다(예: LOOPS=${__P(loops,10)} ) . 이것은 속성 " 루프 "의 값을 사용하며 속성을 찾을 수 없는 경우 기본값은 10 입니다. 그런 다음 JMeter 명령줄에서 " 루프 " 속성을 정의할 수 있습니다.

jmeter … -Jloops=12 …
함께 변경해야 하는 속성이 많은 경우 이를 달성하는 한 가지 방법은 속성 파일 집합을 사용하는 것입니다. -q 명령줄 옵션 을 사용하여 적절한 속성 파일을 JMeter에 전달할 수 있습니다 .

16.12 JSR223 요소

집중적인 부하 테스트의 경우 권장되는 스크립팅 언어는 ScriptingEngine이 Compilable 인터페이스를 구현하는 언어입니다. Groovy 스크립팅 엔진은 Compilable 을 구현합니다 . 그러나 Beanshell이나 Javascript는 JMeter 3.1 출시일 현재 그렇게 하지 않으므로 집중적인 로드 테스트를 위해 사용을 피하는 것이 좋습니다.

참고: Beanshell은 Compilable 인터페이스를 구현하지만 코딩되지 않았습니다. 메서드는 예외를 throw합니다. JMeter에는 이 버그에 대한 명시적인 해결 방법이 있습니다.
JSR 223 요소를 사용 하는 경우 기본 언어가 지원하는 경우 스크립트 컴파일이 캐시되는지 확인하기 위해 사용 가능한 경우 컴파일된 스크립트 캐시 속성을 확인하는 것이 좋습니다. 이 경우 캐싱은 ${varName} 의 첫 번째 값만 사용하므로 스크립트가 ${varName} 을 사용하는 변수를 사용하지 않는지 확인하십시오 . 대신 다음을 사용하십시오.
vars.get("varName")

스크립트에 매개변수로 전달하고 이런 식으로 사용할 수도 있습니다.

16.13 스레드와 스레드 그룹 간의 변수 공유

변수는 스레드에 대해 로컬입니다. 한 스레드에 설정된 변수는 다른 스레드에서 읽을 수 없습니다. 이것은 의도적으로 설계된 것입니다. 테스트가 시작되기 전에 결정할 수 있는 변수는 테스트 매개변수화 (위)를 참조하십시오. 테스트가 시작될 때까지 값을 알 수 없는 경우 다양한 옵션이 있습니다.

  • 변수를 속성으로 저장 - 속성은 JMeter 인스턴스에 대해 전역적입니다.
  • 변수를 파일에 쓰고 다시 읽습니다.
  • bsh.shared 네임스페이스 사용 - 위 참조
  • 자신의 Java 클래스 작성

16.14 속성 관리

jmeter 속성을 수정해야 하는 경우 jmeter.properties 파일을 수정하지 말고 대신 jmeter.properties 에서 속성을 복사하고 user.properties 파일 에서 해당 값을 수정해야 합니다 .
이렇게 하면 다음 버전의 JMeter로 쉽게 마이그레이션할 수 있습니다.
문서에서 jmeter.properties 가 자주 언급되지만 " jmeter.properties 에서 user.properties 로 수정하려는 속성 으로 복사하고 후자의 파일에서 수행"으로 이해해야 합니다 .

user.properties 파일은 jmeter.properties 에 정의된 속성을 대체합니다.

16.15 사용되지 않는 요소

더 이상 사용되지 않는 요소( 변경 목록구성 요소 참조 에 표시됨 )를 사용하지 않고 가능한 경우 새 권장 요소로 마이그레이션하거나 동일한 작업을 수행하는 새로운 방법을 사용하는 것이 좋습니다.
사용되지 않는 요소는 버전 N의 메뉴에서 제거되지만 user.properties 파일의 not_in_menu 속성 을 수정 하고 요소의 전체 클래스 이름을 제거하여 마이그레이션을 위해 활성화할 수 있습니다.

버전 N에서 더 이상 사용되지 않는 요소는 버전 N+1에서 확실히 제거되므로 가능한 한 빨리 사용을 중지해야 합니다.
Go to top