jmeter 2차 개발에 대한 자세한 설명

배경:

  JMeter는 강력한 성능 테스트 도구이지만 특정 프로젝트나 조직의 특정 요구 사항을 충족하지 못할 수도 있습니다. 2차 개발을 통해 JMeter를 특정 프로젝트의 요구 사항에 맞게 사용자 정의할 수 있습니다. 예를 들어 사용자 정의를 추가해야 할 수도 있습니다.

테스트 구성 요소, 보고서 생성기 또는 결과 분석기 등 보조 개발의 세 가지 방법:

  • 사용자 정의 BeanShell 기능
  • 사용자 정의 요청 작성(Java 샘플러)
  • 사용자 정의 함수 도우미

사용자 정의  BeanShell  함수

  JMeter에서는 사용자 정의 스크립팅 및 실행을 위해 BeanShell 스크립트를 사용할 수 있습니다. BeanShell은 기능을 확장하거나 특정 동작을 구현하기 위해 JMeter에서 스크립팅을 작성할 수 있는 Java 기반 스크립팅 언어입니다. 이는 작은 Java 소스 코드 인터프리터와 동일하며 간단히 말해서 코드를 작성한 다음 Beanshell을 사용하여 이를 플러그인이 인식하여 관련 작업을 수행할 수 있는 명령으로 변환할 수 있습니다.

1. 구성 요소에서 BeanShell 기능을 구성합니다.

JMeter의 구성 요소에서는 BeanShell 기능을 사용하여 변수를 설정하고, 동적 데이터를 생성하거나, 기타 사용자 정의 논리를 수행할 수 있습니다. 예를 들어, 각 스레드에서 난수를 생성하여 변수에 저장하려는 경우 다음을 사용할 수 있습니다.

다음 BeanShell 스크립트를 사용하십시오.

int randomNumber = (int) (Math.random() * 100);
vars.put("randomNumber", String.valueOf(randomNumber));

BeanShell 스크립트에서는 일반 Java 구문과 함수뿐만 아니라 JMeter에서 제공하는 특정 함수와 변수도 사용할 수 있습니다. 위의 예에서는 Math.random() 함수를 사용하여 난수를 생성하고 이를 RandomNumber라는 JMeter 변수에 저장합니다.

2. 전처리기와 후처리기의 BeanShell 기능:

  BeanShell은 요청을 얻거나 처리하거나 콘텐츠를 반환하는 데 가장 일반적으로 사용됩니다. 여기서 prev는 현재 샘플에 액세스하고 응답 상태 코드, 응답 정보, 요청 헤더 등에 대한 작업을 수행합니다. 예는 다음과 같습니다.

log.info("code is  "+prev.getResponseCode());
 
#获取响应的状态码
 
log.info("response is "+prev.getResponseDataAsString());
 
#获取响应信息
 
log.info("content_type  "+prev.getContentType());
 
#获取头文件中ContentType类型
 
log.info("header "+prev.getRequestHeaders());
 
#获取取样器请求首部字段

JMeter는 BeanShell 인터프리터를 호출하여 스크립트를 실행하는데, 사용하기는 쉽지만 JMeter의 동시성이 높을 경우 더 많은 로컬 리소스를 소모하므로 자주 사용하지 않는 것이 좋습니다. 코드의 양이 많습니다.

이 경우 JMeter의 또 다른 기능인 사용자 정의 플러그인(jar 형식) 개발을 사용합니다. 일반적으로 사용자 정의 플러그인은 두 가지 기능을 달성하는 데 도움이 됩니다.

JMeter 자체는 자체 요청을 확장해야 하거나 테스트 프로토콜을 지원하지 않습니다. Java 요청을 사용하여 이를 완료하고
보조 기능을 사용자 정의하여 성능 테스트에 도움을 줄 수 있습니다.

사용자 정의 요청 작성(Java 샘플러)

Java 샘플러 기능을 구현하는 두 가지 방법
  • AbstractJavaSamplerClient 추상 클래스를 상속합니다.
  • JavaSamplerClient 인터페이스를 구현합니다.

소스 코드를 읽으면 AbstractJavaSamplerClient 추상 클래스가 JavaSamplerClient 인터페이스의 하위 클래스라는 것을 알 수 있습니다. JavaSamplerClient 인터페이스의 네 가지 주요 메소드는 다음과 같습니다.

  1. setupTest(JavaSamplerContext):

    setupTest 메서드는 테스트를 실행하기 전에 호출되어 리소스를 초기화하거나 필요한 전제 조건을 설정합니다. 테스트 계획, 스레드 그룹 및 전역 구성에 대한 액세스를 제공하는 매개변수로 JavaSamplerContext 개체를 받습니다.

상황정보 등 setupTest 메소드에서는 데이터베이스 연결 설정, HTTP 클라이언트 생성 등과 같은 일회성 초기화 작업을 수행할 수 있습니다. 이 메서드는 전체 테스트 계획 수명 주기 동안 한 번만 호출됩니다.         

  2. getDefaultParameters():

    getDefaultParameters 메소드는 기본 요청 매개변수를 정의하는 데 사용됩니다. 요청 매개변수의 기본값과 설명이 포함된 JMeterArgumentsArray 객체를 반환합니다. 이러한 기본 매개변수는 JMeter의 사용자 인터페이스에 표시되며 사용자는 필요에 따라 이를 수정할 수 있습니다. 이 방법을 사용하면 사용자 정의 Java 샘플러에 대한 기본 요청 매개변수를 제공할 수 있으므로 구성 및 사용이 쉬워집니다. 

  3. getSampleVariables():

    getSampleVariables 메소드는 요청 실행 중에 저장하려는 변수 이름이 포함된 문자열 배열을 반환합니다. 이러한 변수는 다른 구성 요소에서 사용할 수 있도록 JMeter의 SampleResult 개체에 저장됩니다. 이 방법을 사용하면 테스트 계획의 다른 구성 요소에서 참조하고 사용할 사용자 정의 Java 샘플러 생성 변수를 지정할 수 있습니다.

  4. 테스트 실행(JavaSamplerContext):

    runTest 메소드는 사용자 정의 요청 로직의 구현을 포함하는 가장 중요한 메소드입니다. 테스트 계획, 스레드 그룹, 전역 구성 등에 액세스하기 위한 컨텍스트 정보를 제공하는 매개변수로 JavaSamplerContext 객체를 받습니다. runTest 메서드에서는 HTTP 요청, 데이터베이스 쿼리 또는 기타 사용자 지정 작업 수행과 같은 사용자 지정 요청 논리를 작성할 수 있습니다. JMeter에서 제공하는 API를 사용하여 요청 매개변수, 변수, 결과 수집기 등에 액세스하고 사용할 수 있습니다.

SampleResult 객체를 사용하여 요청 결과, 응답 메시지, 상태 코드 등을 설정합니다.

사례: JavaSampler를 사용하여 HTTP  POST  요청 재작성

 1) 먼저 POST 요청의 핵심 메소드를 완성해 보겠습니다. 먼저 HttpClients를 사용하여 구성된 POST 패킷을 보낸 다음 반환 값을 얻습니다. 이 단계는 POST 요청을 완료하는 기본 단계입니다. 샘플 코드는 다음과 같습니다. :

//HttpClients提供功支持 HTTP 协议的客户端工具
 
httpClient = HttpClients.createDefault();
 
//新建一个HttpPost请求的对象将url,接口参数等信息传给这个对象
 
HttpPost httpPost = new HttpPost(URL);
 
//传入请求参数
 
httpPost.setEntity(new UrlEncodedFormEntity(Value, UTF8_CHARSET));
 
// 设置header信息,指定报文头Content-type等
 
httpPost.setHeader("Content-type", "xxxxx");
 
// 执行请求操作,并拿到结果
 
response = httpClient.execute(httpPost);

(2) 다음으로 JavaSamplerClient 인터페이스를 구현하는데, 이는 Java Sampler Plug-in 작성 시 구현해야 하는 핵심 인터페이스이며, 관련된 메소드는 위에서 설명한 getDefaultParameters() 및 runTest() 이다. 다음 코드와 같이 사용 방법을 보여 드리겠습니다.

public Arguments getDefaultParameters() {
 
    Arguments arguments = new Arguments();
 
    arguments.addArgument("url","127.0.0.1:9081");
 
    arguments.addArgument("username", "zhangtian");
 
    arguments.addArgument("password", "12345");
 
    return arguments;
 
}

(3) 이전 단계에서는 매개변수를 입력한 다음 매개변수를 수신하고 매개변수를 입력, 전송, 반환 및 판단합니다. runTest 이 메서드에서는 주로 다음 코드에 표시된 대로 고유한 요청 논리를 작성합니다.

public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
 
    //生成sampleResult对象,用于请求的命名、标记状态、添加返回内容等
 
    SampleResult sampleResult=new SampleResult();
 
    sampleResult.setSampleLabel("cctester_login");
 
    //调用上文中实现的post请求
 
    PostTest postTest=new PostTest();
 
    //接受JMeter界面上传输的参数
 
    String username = javaSamplerContext.getParameter("username");
 
    String password = javaSamplerContext.getParameter("password");
 
    String url = javaSamplerContext.getParameter("url");
 
    //标记请求开始
 
    sampleResult.sampleStart();
 
    try {
 
        HttpResponse result =postTest.Request(url,username,password);
 
        String entity= EntityUtils.toString(result.getEntity());
 
        //根据返回内容判断结果状态并展示结果
 
        if (result.getStatusLine().getStatusCode()==200){
 
            sampleResult.setSuccessful(true);
 
            sampleResult.setResponseCodeOK();
 
            sampleResult.setResponseData(entity, "utf-8");
 
        }else {
 
            sampleResult.setSuccessful(false);
 
            sampleResult.setResponseData(entity, "utf-8");
 
(4) Java 클래스를 JAR 파일로 컴파일하고 JMeter가 로드할 수 있도록 해당 JAR 파일을  lib/ext JMeter 디렉터리 에 배치합니다.

사용자 정의 함수 도우미

1) 다음 코드와 같이 기능 보조 개발과 관련된 클래스를 제공하는 Maven 패키지를 소개합니다.

<dependency>
 
    <groupId>org.apache.jmeter</groupId>
 
    <artifactId>ApacheJMeter_functions</artifactId>
 
    <version>5.3</version>
 
</dependency>

(2) 새 클래스 패키지를 생성합니다. 새 패키지의 이름은 함수로만 끝날 수 있습니다. 그렇지 않으면 JMeter에 패키지하여 배치할 때 플러그인을 식별할 수 있는 방법이 없습니다. 그러면 AbstractFunction 클래스를 상속할 수 있습니다. 코드는 다음과 같은 메소드를 주로 구현합니다.

  public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称
  public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示
  public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入
   public String execute(SampleResult sampleResult, Sampler sampler){}  // 根据入参,执行核心逻辑,保存结果至相应的变量中

마지막으로 제 글을 주의 깊게 읽어주시는 모든 분들께 감사의 말씀을 전하고 싶습니다. 호혜는 언제나 필요합니다. 비록 그다지 귀중한 것은 아니지만, 사용할 수 있다면 직접 가져갈 수 있습니다.

여기에 이미지 설명을 삽입하세요.

이 정보는 [소프트웨어 테스팅] 친구들을 위한 가장 포괄적이고 완벽한 준비 창고가 되어야 합니다. 이 창고는 또한 가장 어려운 여정을 통해 수만 명의 테스트 엔지니어와 동행했습니다. 또한 도움이 되기를 바랍니다!   

Supongo que te gusta

Origin blog.csdn.net/YLF123456789000/article/details/133273824
Recomendado
Clasificación