JMeter의 한 스레드 그룹에서 다른 스레드 그룹으로 변수를 전달하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/707832

문제

2 개의 스레드 그룹을 가진 JMeter 테스트가 있습니다. 첫 번째는 단일 스레드 (일부 인벤토리를 생성)이고 두 번째 스레드는 여러 스레드 (모든 인벤토리를 구매)를 가지고 있습니다. BeanShell Assertions 및 XPath 추출기를 사용하여 리턴 값 (XML) 및 저장 변수 (예 : 구매할 품목의 ID)를 구문 분석합니다.

그러나 첫 번째 스레드 그룹에서 생성 된 값은 표준으로 추출하든 ${jmeter} 유형 변수, 또는 ${__BeanShell(vars.get("jmeter"))} Type Vars는 두 번째 스레드 그룹에서 사용할 수 없습니다. 어쨌든 첫 번째 스레드 그룹에서 변수를 만들고 두 번째로 보이게 할 수 있습니까?

도움이 되었습니까?

해결책

변수 로이 작업을 수행 할 수 없었습니다 (이는 개별 스레드에 로컬이므로). 그러나이 문제를 속성으로 해결할 수있었습니다!

다시 말하지만, 첫 번째 스레드 그룹은 모든 설정을 수행하며, 두 번째 스레드 그룹의 각 스레드에서 해당 작업의 정보가 필요합니다. 첫 번째 스레드 그룹에 다음과 같은 콩나무 어설 션이 있습니다.

${__setProperty(storeid, ${storeid})};

$ {storeid}는 XPath 추출기로 추출되었습니다. Beanshell Assertion은 Storeid가 이전 통화에서 반환되었는지 확인하는 것과 같은 다른 작업을 수행합니다.

어쨌든, 두 번째 스레드 그룹에서는 다음과 같은 샘플러에서 "StoreId"속성의 값을 사용할 수 있습니다.

${__property(storeid)}

매력처럼 작동합니다!

다른 팁

JMeter 문서에 따르면 :

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

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

  1. 변수를 속성으로 저장 - 속성은 전역에서 JMeter 인스턴스입니다.
  2. 변수를 파일에 쓰고 다시 읽습니다.
  3. Bsh.shared 네임 스페이스 사용 - 참조 16.8.2 공유 변수
  4. 나만의 Java 수업을 작성하십시오

스레드간에 변수를 전달하는 또 다른 방법은 JMeter-Plugins를 사용하는 것입니다. 아래 Andrey Botalov가 언급했습니다.

그러나 처음으로 사용하는 것이 약간 혼란 스럽지만 스레드에서 스레드로 전달하는 동안 변수를 완전히 제어합니다. Beanshell 사용법으로 내 예제를 따르십시오.

Project stucture다음으로 Picture Bellow의 섹션을 참조하십시오.

(1.1) 여기서 사용자 정의 변수에서 사용자 정의 변수를 만들었습니다 (또는 BSF Proccessor-이 예제에서 비활성화 할 수 있습니다 (1.2).

(2.1) (2.4) 첫 번째 스레드에서 변수를 성공적으로 사용했습니다.

(2.2) 추가 Beanshell PostProcessor를 추가하고 내 변수를 사용자 정의했습니다.

(2.3)을 큐에 추가했습니다

(3.1) 두 번째 스레드에서 - 변수는 큐에서 가져옵니다. 원하는 이름이 있습니다. 그러나이 스레드는 이전 마감까지 기다릴 수 있으므로 수정 된 변수를 얻을 수 있으므로 현명한 시간 초과를 사용하십시오 (긴 응답 실험).

(3.2) (3.3) (3,4) 변수를 사용하고 수정하는 단계를 반복 한 단계

(3.5) 변수는 새로운 대기열에서 다시 한 번 전송됩니다. 따라서 새 이름을 제공하십시오.

(4.1) (4.2) (4.3) 새 대기열 작품에서 수정 된 변수를 잡았습니다.

경고

  1. 더 많은 스레드를 추가하면 변수가있는 스레드 그룹에 카운터를 추가하고 큐 이름 에이 변수 이름을 추가합니다. 큐를 잡으려고하는 스레드 그룹에서 동일하게 수행하므로 큐는 각 스레드에 고유 한 이름을 갖습니다 (귀하가 주석을 작성하면 댓글을 작성하십시오. 명확한 설명이 필요합니다)

  2. 하나의 스레드 그룹에 둘 이상의 HTTP 요청이있는 경우 스레드 커뮤니케이션 프리 프로세서를 마지막으로 (또는 사용자 정의를 달성하려는 경우) HTTP 요청의 자식으로 추가하십시오.

재생, 수정, 최상의 결과를 얻기 위해 사용자 정의 :) 더 많은 스레드를 추가하면 원치 않는 동작이 발생할 수 있으므로 조심해야합니다.

Information about project structure

나는 이것을 끝내는 가장 간단한 방법이라고 생각하는 것을 발견했습니다.

사용

Bean Shell PostProcessor

변수를 설정하려면 (http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");

또는 변수에서 읽는 경우

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));

그런 다음 다른 스레드 그룹에서 읽으십시오.http://jmeter.apache.org/usermanual/functions.html#__property)

${__property(PC_CREATED_PROMO_CODE)}

JMeter 플러그인이 있습니다 스레드 간 커뮤니케이션 이 목적을 위해.

사용하는 방법에는 두 가지가 있습니다.

  • 후 처리기/사전 처리기
  • 기능 __fifoPut 그리고 __fifoPop

내 의견으로는 후 프로세서/사전 처리기가 사용하기가 더 쉽습니다.

JMeter에서는 정상적인 클라이언트 동작 (스레드간에 매개 변수를 공유)이 아니기 때문에 이것은 불가능합니다. 이 대신 컨트롤러와 함께 하나의 스레드 그룹을 사용합니다.

Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory

글쎄, 이것은 그것을하는 한 가지 방법입니다. 다음 단계를 따르면 작동하면 나중에 필요에 맞게 조정할 수 있습니다! 변수는 스레드간에 공유되지 않습니다 (JMeter는 이것을 기능이라고합니다 :)). 그러나 속성은! 따라서 변수를 다음과 같은 프로모리로 설정하십시오.

1) TestPlan을 클릭하고 '스레드 그룹을 연속적으로 사용합니다' -> 이렇게하면 스레드 그룹이 무작위로 순서대로 실행됩니다. (나중에 조정할 수 있지만 지금은 작동하기 위해 ..)

2) 예를 들어 '설정'이라는 스레드 그룹을 만듭니다. 해당 스레드 그룹에서 다음 코드와 함께 BeanShell 샘플러를 추가합니다.

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");

이제 재산이 설정되었습니다! 프로모리로 저장하려는 값이 변수 Allready (예를 들어 사용자 DEFIND 변수 또는 ReqEx 변수) 인 경우 다음을 수행 할 수 있습니다.

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));

3) 예를 들어 1보다 높은 여러 스레드가있는 테스트 그룹 '실제 테스트'를 추가하십시오. 테스트 추가 및 해당 테스트에 다음 코드와 함께 Beanshell Preprocessor를 추가하십시오.

import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));

이제 시스템 속성의 값을 갖는 theameofyournewProperty의 값을 갖는 theameofyournewproperty라는 스레드에서 변수를 만들었습니다. 테스트에서 다음과 같이 액세스 할 수 있습니다.

${theNameOfYourNewProperty}

그리고 첫 번째 스레드뿐만 아니라 각 스레드에 대해 작동합니다 ..

'주제를 세 번째 수명을주십시오 :) 스레드간에 변수를 전송하는 한 가지 더 많은 방법은 쓰기/읽기에 파일을 읽는 것입니다. 스레드 사이의 변수를 전달합니다

또 다른 솔루션은 간단한 테이블 서버를 사용하여 데이터 세트를 관리하는 것입니다. 이 기능은 1.2 JMeter 플러그인을 추가했습니다.

"주요 아이디어는 JMeter 플러그인의 작은 HTTP 서버를 사용하여 간단한 명령으로 데이터 세트 파일을 관리하는 것입니다. 가져 오기 / 추가하다 파일의 데이터 행 "

문서를보십시오 :http://jmeter-plugins.org/wiki/httpsimpletableserver/

문안 인사.

JMeter Bean Shell Assertion

Bean Shell Assertion을 추가하여 속성 함수를 사용하여 다른 스레드로 이동 한 후에도 값을 유지하는 변수 (전역 변수와 같은)에 값을 할당하십시오.

스레드 그룹 >> 추가 >> 어설 션 >> Bean Shell Assertion

${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}

그런 다음 다른 스레드에서는이 글로벌 변수를 호출 할 수 있으며 사용할 수 있습니다.

아래는 저장된 값을 호출하는 데 사용하는 기능입니다.

${__property(global_variable_name)}

https://medium.com/@priyank.it/jmeter-passing-variables-between-sween-swin-shreads-a4dc0903b59

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top