【性能测试】jmeter测试时查看结果树返回结果中文显示问题

问题是什么

在日常jmeter测试过程中,初学者可能会遇到最多的一个问题就是中文乱码,比如下面这个案列

整体请求过程正常,但是返回结果在中文显示的有点问题

分析问题

出现这个问题的原因,最容易想到的就是编码问题,在jmeter里面,有如下两种情况导致:

  • jmeter工具配置的问题
  • 接口本身的问题
  1. jmeter工具配置的问题

JMeter 默认的字符编码可能与你的系统或被测试应用的字符编码不一致,这会导致显示乱码

  1. 接口本身的问题

服务器端可能没有正确地设置响应头中的 Content-Type 字段,或者其值与实际的编码不一致。例如,服务器可能发送了 UTF-8 编码的数据,但是 Content-Type 头部却指示了不同的编码,如 ISO-8859-1。

如何解决问题

jmeter工具配置的问题解决

1.在 HTTP 请求中设置字符集:
你可以直接在 HTTP 请求采样器的“HTTP Request”面板中设置 Content Encoding。通常情况下,将编码设置为 UTF-8 应该可以解决大部分的中文乱码问题。

2.在 HTTP 消息头部设置 Content-Type:
这个方法是告诉服务器你期望接收的数据类型和字符编码。在“HTTP Header Manager”中添加一个 header,键为 Content-Type,值设为 application/json;charset=UTF-8 或者 application/xml;charset=UTF-8,具体取决于你接收的是 JSON 还是 XML 格式的数据。

3.修改 jmeter.properties 文件:
这个方法是在全局层面上设置 JMeter 处理响应数据时默认使用的编码。你需要找到 JMeter 安装目录下的 bin 文件夹中的 jmeter.properties 文件,然后修改 sampleresult.default.encoding 属性,将其值设置为 UTF-8。这会影响到所有使用 JMeter 的测试,而不仅仅是特定的 HTTP 请求。

sampleresult.default.encoding=UTF-8
接口本身的问题解决

通常来说,jmeter工具配置解决的方法应该足以解决问题,因为它们直接作用于具体的请求上。

通过代码去转换接口返回的结果,下面是一个简单的unicode编码转为正常汉字:

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());

通过如上的转换后,请求结果页显示正确了。

如果你发现某个特定的请求还是存在问题,那么检查服务器端返回的实际编码是否与你设置的编码一致也很重要。有时候,服务器可能没有正确地设置响应头中的编码信息,这时你可能需要与后端开发人员沟通,确保他们正确设置了响应的编码。

文章原创首发于微信公众号 软件测试微课堂,更多内容欢迎关注微信公众号查看

<think>首先,用户的问题是:在JMeter性能测试中,当执行查询结果返回的access_token不能为空。用户想知道如何解决这个问题。 从用户提供的引用中,我可以提取一些相关信息: - 引用[1]提到JMeter可以读取JSON数据并提取信息。 - 引用[2]强调在API测试中需要添加token到请求头中,否则请求会被拦截。 - 引用[3]讨论了QPS和TPS的概念,但与问题直接无关。 - 引用[4]是关于获取文档和视频的,不相关。 关键点是access_token不能为空。这很可能是因为在JMeter测试中,请求没有正确设置token,导致服务器返回错误或拒绝访问。 用户的问题集中在“查询结果返回access_token不能为空”。在JMeter中,查询结果(View Results Tree)是一个监听器,用于查看响应数据。所以,用户可能在响应中看到access_token为空,表示认证失败。 解决方案应该包括: 1. **确保token正确设置**:根据引用[2],需要在请求头中添加token(如X-Access-Token)。这可以通过HTTP Header Manager组件实现。 2. **提取token**:如果token是动态生成的(如在登录响应中),需要使用后置处理器(如JSON Extractor或Regular Expression Extractor)从响应中提取token,并存储为变量。 3. **在后续请求中使用token**:将提取的token变量添加到后续请求的头中。 4. **验证token提取**:使用Debug Sampler或View Results Tree检查提取的token是否有效。 回顾用户上一次的问题:用户提到了“查询结果返回access_token不能为空”,所以可能是用户已经设置了提取token的逻辑,但提取失败,导致为空。 在我的回答中,我应该: - 结构清晰,逐步解决问题。 - 使用中文回答。 - 遵守系统指令:行内公式用$...$,独立公式用$$...$$(但这个问题可能不涉及数学公式)。 - 生成相关问题(在最后)。 步骤建议: 1. **诊断问题**:解释为什么access_token可能为空。 2. **解决方案步骤**: - 确保登录请求成功并提取token。 - 正确添加token到请求头。 - 测试提取过程。 3. **示例代码**:提供JMeter脚本的伪代码或步骤。 4. **验证**:建议如何验证token不为空。 5. **生成相关问题**。 现在,构建回答: - **引言**:直接针对问题。 - **步骤**:分步解释。 - **结尾**:相关问题。 确保引用正确:用户在引用[2]中提到了token机制,所以我可以引用它。 </think>### JMeter性能测试中查询结果返回access_token不能为空的解决方案 在JMeter性能测试中,如果在View Results Tree监听器中返回的access_token为空,这通常表示服务器端认证失败或token传递错误。根据引用[2],API接口通常使用token机制(如X-Access-Token)进行权限认证,如果token为空或无效,请求会被服务器拦截。常见原因包括token未正确提取、未添加到请求头,或提取逻辑错误。以下我将逐步解释诊断和解决方法,确保access_token不为空。 #### 步骤1: 诊断问题根源 在实际测试中,access_token为空可能由以下原因引起: - **token未正确提取**:如果token是从登录响应中动态获取的,可能有后置处理器(如JSON Extractor)失败。 - **token未传递到请求头**:后续请求未使用HTTP Header Manager添加token。 - **认证逻辑错误**:登录请求本身失败,导致token生成失败。 - **变量作用域问题**:token变量未在JMeter线程组中正确共享。 首先,检查View Results Tree中的响应数据: - 确认登录请求的响应是否包含access_token字段。 - 如果响应中有token但为空,检查服务器日志或API文档,确认认证逻辑是否正确(如用户名/密码错误)。 #### 步骤2: 确保token正确生成并提取 如果access_token是从登录响应中获取的,使用后置处理器提取它: 1. **添加JSON Extractor**: - 在登录请求(如POST /login)后,添加一个JSON Extractor。 - 配置示例: - **Variable names**: `access_token` - **JSON Path expressions**: `$.access_token`(根据API响应结构调整,例如`$.data.token`) - **Default Value**: 留空或设置默认值(如`NOT_FOUND`),以便失败调试。 - 这会将token保存为变量`${access_token}`,后续请求可直接引用。 2. **验证提取结果**: - 在JSON Extractor后添加一个Debug Sampler,查看提取的变量值。 - 或在View Results Tree中检查登录请求的响应,确认JSON Path是否正确匹配token字段。 如果API响应不是JSON格式,使用Regular Expression Extractor: - **Reference name**: `access_token` - **Regular Expression**: `"access_token":"(.+?)"`(根据响应文本调整) - **Template**: `$1$` #### 步骤3: 在后续请求中添加token到请求头 根据引用[2],必须在每个需要认证的请求中添加token到HTTP头: 1. **添加HTTP Header Manager**: - 在需要认证的请求(如GET /user)前,添加一个HTTP Header Manager。 - 配置Header: - **Name**: `X-Access-Token`(或API指定的header名,如`Authorization`) - **Value**: `${access_token}`(使用步骤2提取的变量) 2. **处理cookie认证(可选)**: - 如果API使用cookie而非token,添加HTTP Cookie Manager组件(引用[2]提到)。 #### 步骤4: 测试和验证 运行测试计划,确保access_token不为空: - **检查View Results Tree**:关注后续请求的响应,access_token应显示值(如`eyJhbGciOi...`)。 - **添加断言**:在请求后添加Response Assertion,检查响应中是否包含token: - **Pattern**: `"access_token":".+?"`(确保token非空) - **监控变量**:使用JMeter的Debug Post-Processor或日志查看器监控`${access_token}`的值。 - **常见错误处理**: - 如果token过期:在测试计划中添加逻辑定期刷新token。 - 如果提取失败:确认JSON Path或正则表达式匹配响应结构(必要使用简单数据测试)。 #### 示例JMeter测试计划片段 以下是一个简化脚本示例: ``` Test Plan ├─ Thread Group ├─ HTTP Request: POST /login (发送用户名/密码) │ ├─ JSON Extractor: Variable=access_token, JSON Path=$.token ├─ HTTP Header Manager (添加token头) │ ├─ Header: X-Access-Token = ${access_token} ├─ HTTP Request: GET /data (需要认证的请求) ├─ View Results Tree (查看响应,确认access_token不为空) ``` 如果问题持续,检查服务器状态或API文档,确认token生成是否正确(如OAuth 2.0流程)。性能测试中,token管理是核心,错误可能导致TPS/QPS指标不准确(引用[3])。 #### 相关问题 1. JMeter中如何提取动态token并在多个线程组中共享? 2. 如何优化JMeter脚本以减少token认证带来的性能开销? 3. JMeter中处理token过期有哪些最佳实践? 如需进一步帮助,请提供更多测试上下文(如登录响应示例)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abao_yuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值