JMeter의 한 스레드 그룹에서 다른 스레드 그룹으로 변수를 전달하려면 어떻게합니까?
문제
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 스레드와 스레드 그룹 간의 변수 공유
변수는 스레드에 로컬입니다. 한 스레드에서 설정된 변수는 다른 스레드에서 읽을 수 없습니다. 이것은 디자인에 의한 것입니다. 테스트가 시작되기 전에 결정할 수있는 변수의 경우 매개 변수화 테스트 (위)를 참조하십시오. 테스트가 시작될 때까지 값을 알 수없는 경우 다양한 옵션이 있습니다.
- 변수를 속성으로 저장 - 속성은 전역에서 JMeter 인스턴스입니다.
- 변수를 파일에 쓰고 다시 읽습니다.
- Bsh.shared 네임 스페이스 사용 - 참조 16.8.2 공유 변수
- 나만의 Java 수업을 작성하십시오
스레드간에 변수를 전달하는 또 다른 방법은 JMeter-Plugins를 사용하는 것입니다. 아래 Andrey Botalov가 언급했습니다.
그러나 처음으로 사용하는 것이 약간 혼란 스럽지만 스레드에서 스레드로 전달하는 동안 변수를 완전히 제어합니다. Beanshell 사용법으로 내 예제를 따르십시오.
다음으로 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) 새 대기열 작품에서 수정 된 변수를 잡았습니다.
경고
더 많은 스레드를 추가하면 변수가있는 스레드 그룹에 카운터를 추가하고 큐 이름 에이 변수 이름을 추가합니다. 큐를 잡으려고하는 스레드 그룹에서 동일하게 수행하므로 큐는 각 스레드에 고유 한 이름을 갖습니다 (귀하가 주석을 작성하면 댓글을 작성하십시오. 명확한 설명이 필요합니다)
하나의 스레드 그룹에 둘 이상의 HTTP 요청이있는 경우 스레드 커뮤니케이션 프리 프로세서를 마지막으로 (또는 사용자 정의를 달성하려는 경우) HTTP 요청의 자식으로 추가하십시오.
재생, 수정, 최상의 결과를 얻기 위해 사용자 정의 :) 더 많은 스레드를 추가하면 원치 않는 동작이 발생할 수 있으므로 조심해야합니다.
나는 이것을 끝내는 가장 간단한 방법이라고 생각하는 것을 발견했습니다.
사용
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/
문안 인사.
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