MeterSphere 接口请求及响应内容中特殊内容的脚本化处理


朱飞鸽
飞致云 发布于 2023-12-06 / 418 阅读 / 0 评论 /
MeterSphere 在做接口测试过程中,有些请求及响应的特殊内容需要通过脚本进行处理,才能达到期望的测试结果,本文针对特殊内容的脚本处理做简单介绍,能够帮助大家利用脚本灵活处理接口请求以及响应内容。 一、通过前置脚本处理接口请求内容 1.1 如何通过前置脚本添加或者修改请求头信息 针对某些接口请

MeterSphere 在做接口测试过程中,有些请求及响应的特殊内容需要通过脚本进行处理,才能达到期望的测试结果,本文针对特殊内容的脚本处理做简单介绍,能够帮助大家利用脚本灵活处理接口请求以及响应内容。

一、通过前置脚本处理接口请求内容

1.1 如何通过前置脚本添加或者修改请求头信息

针对某些接口请求头需要进行逻辑性的参数添加及修改,常规的函数或者变量无法达到要求,此时可以通过前置脚本进行处理。具体 BeanShell 脚本内容如下:

import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.Header;
  
// 获得请求头信息
HeaderManager headers = sampler.getHeaderManager();
// 打印全部请求头信息
log.info("添加前" + headers.getHeaders().getStringValue());
// new一个Header对象
myHeader = new Header("x-parse-session-token", "123456432");
// 添加Header到请求头管理器
headers.add(myHeader);
// 打印全部请求头信息
log.info("添加后" + headers.getHeaders().getStringValue());

1.2 如何通过前置脚本获取请求中的域名或者 host 信息

某些场景需要通过前置脚本针对不同的域名或者请求host进行逻辑处理,就需要通过如下BeanShell脚本获取信息:

import org.apache.jmeter.config.Arguments;
import java.util.Map.Entry;
  
Arguments args = sampler.getArguments();
//获取域名或者host信息
log.info("domain: "+sampler.getDomain());
//获取请求参数
Map map = args.getArgumentsAsMap();
Iterator itor = map.entrySet().iterator();
while(itor.hasNext()){
  Entry entry = (Entry) itor.next();
  log.info("==========key:"+entry.getKey());  
}

二、通过后置脚本处理接口响应内容

2.1 如何通过后置脚本将 Unicode 转码为中文

当响应内容为 Unicode 时,在 MeterSphere 上显示的内容为乱码,此时就需要通过后置脚本将响应内容转化为 UTF-8,以便于正常显示。在对应接口下添加一个后置脚本,详细的BeanShell 脚本如下:

String s=new String(prev.getResponseData(),"UTF-8");
        char aChar;
        int len= s.length();
        StringBuffer outBuffer=new StringBuffer(len);
        for(int x =0; x <len;){
            aChar= s.charAt(x++);
            if(aChar=='\\'){
                aChar= s.charAt(x++);
                if(aChar=='u'){
                    int value =0;
                    for(int i=0;i<4;i++){
                        aChar= s.charAt(x++);
                        switch(aChar){
                            case'0':
                            case'1':
                            case'2':
                            case'3':
                            case'4':
                            case'5':
                            case'6':
                            case'7':
                            case'8':
                            case'9':
                                value=(value <<4)+aChar-'0';
                                break;
                            case'a':
                            case'b':
                            case'c':
                            case'd':
                            case'e':
                            case'f':
                                value=(value <<4)+10+aChar-'a';
                                break;
                            case'A':
                            case'B':
                            case'C':
                            case'D':
                            case'E':
                            case'F':
                                value=(value <<4)+10+aChar-'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx  encoding.");}}
                    outBuffer.append((char) value);}else{
                    if(aChar=='t')
                        aChar='\t';
                    else if(aChar=='r')
                    aChar='\r';
                    else if(aChar=='n')
                    aChar='\n';
                    else if(aChar=='f')
                    aChar='\f';
                    outBuffer.append(aChar);}}else
                outBuffer.append(aChar);}
prev.setResponseData(outBuffer.toString());
String s=new String(prev.getResponseData(),"UTF-8");

2.2 如何通过后置脚本将文件内容的响应内容存储到服务器

当接口响应内容为文件时,MeterSphere 会将文件内容显示为乱码,此种方式对于测试人员不太友好,所以可以通过后置脚本将响应的文件内容写入实际的文件到服务器,然后从服务器上的目录下进行拿取(或者写入可访问的文件服务器)。详细的 BeanShell 脚本内容如下:

import java.io.*;
  
byte[] result = prev.getResponseData();
String file_name = "/opt/metersphere/data/xxxx.xxx";
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();



是否对你有帮助?