问题是什么
在日常jmeter测试过程中,初学者可能会遇到最多的一个问题就是中文乱码,比如下面这个案列
整体请求过程正常,但是返回结果在中文显示的有点问题
分析问题
出现这个问题的原因,最容易想到的就是编码问题,在jmeter里面,有如下两种情况导致:
- jmeter工具配置的问题
- 接口本身的问题
- jmeter工具配置的问题
JMeter 默认的字符编码可能与你的系统或被测试应用的字符编码不一致,这会导致显示乱码
- 接口本身的问题
服务器端可能没有正确地设置响应头中的 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());
通过如上的转换后,请求结果页显示正确了。
如果你发现某个特定的请求还是存在问题,那么检查服务器端返回的实际编码是否与你设置的编码一致也很重要。有时候,服务器可能没有正确地设置响应头中的编码信息,这时你可能需要与后端开发人员沟通,确保他们正确设置了响应的编码。
文章原创首发于微信公众号 软件测试微课堂,更多内容欢迎关注微信公众号查看