【轉載】JMeter3.0圖形化HTML報告中文亂碼問題處理

因爲我的在JMeter 3.0的實際應用中,腳本中的Test Plan/Sampler等元件命名都沒有使用中文,因此在以前介紹Dashboard Report特性的博客(原文戳這裏))成文時,沒有提到關於中文的問題。以後有朋友反饋,Sampler名稱爲中文時,生成的報告中展現爲亂碼,本身 測試,確實如此。
  如圖,腳本包含兩個命名爲中文的Sampler:
  執行測試後,生成的Dashboard Report圖表中文亂碼:
  因而經過查看官方文檔和源碼,找到緣由並進行了解決,原打算直接追加到以前那篇 文章,但考慮到篇幅過長,因而決定新成一文,而後在以前的文章中補充連接。
   二. 解決方案
  先上解決方案:修改JMeter report模塊讀取數據源碼中的字符集設置爲UTF-8,編譯後替換到 JMETER_HOME\lib\ext\ApacheJMeter_core.jar 內,這裏會分享一個我處理好的一個jar包,但建議本身親自動手:
   基礎方案
  一、在官網 下載頁面 下載 apache-jmeter-3.0_src.zip
  二、相關源碼位置:
  apache-jmeter-3.0/src/core/org/apache/jmeter/report/core/CsvSampleReader.java
  三、將 CsvSampleReader 的 CHARST 賦值爲 UTF-8
  private static final String CHARSET = StandardCharsets.UTF_8.displayName();
  四、編譯該文件,用獲得的 .class 文件替換 JMETER_HOME\lib\ext\ApacheJMeter_core.jar 內的原文件。固然也能夠直接對源碼從新編譯打包,但會比較費時。
  效果如圖:
推薦方案
  關於設置字符編碼,一個更推薦的方案是設置默認字符編碼爲UTF-8,同時支持.properties配置項。JMeter讀寫結果文件(xml/csv)的字符編碼配置項是 ./bin/saveservice.properties 文件內的 _file_encoding ,由 org.apache.jmeter.save.SaveService.getFileEncoding(String dflt) 讀取,當沒有在配置相中指定時,將使用方法的入參做爲默認編碼,這裏咱們傳入UFT-8做爲默認格式,所以將基礎方案中的步驟3作以下變動:
  private static final String CHARSET = SaveService.getFileEncoding(StandardCharsets.UTF_8.displayName());
  編譯後替換便可。saveservice.properties文件的_file_encoding默認已配置爲UTF-8,多數狀況下,咱們不須要修改。
   文件分享
  分享的文件和jar包是使用推薦方案進行處理。能夠取用class文件本身替換進本地的ApacheJMeter_core.jar,也能夠直接下載分享的jar包替換本地對應jar包。
  · 單獨的CsvSampleReader.class文件: https://pan.baidu.com/s/1bo10QnX ,提取碼 ee68
  · 處理完畢的ApacheJMeter_core.jar: https://pan.baidu.com/s/1mhKLwgw ,提取碼 id7h
  注:github上能夠看到jmeter的trunk分支已經將dashboard report的默認字符編碼更改成UFT-8,本文的推薦方案便是官方更新中的實現方式。只是目前官方尚未發佈更新,因此本身動手。
   三. 成因分析
  Dashboard Report特性生成HTML圖表,使用JMeter記錄測試結果數據的文件 (命令行執行時 -l 指定的文件,也可在圖形界面的監聽器中指定,做爲基礎知識不在這裏展開) 做爲數據源,Apache FreeMarker做爲模板引擎,默認的模板位於JMETER_HOME\bin\report-template。
  · 查看官方說明,確認沒有關於HTML報告字符編碼的配置項。
  · 查看數據源文件,肯定文件格式爲UTF-8,文件中的中文正常可讀,排除數據源存在問題的可能。
  · 查看生成的結果文件,主要數據在 指定路徑/content/js/graph.js ,任選一個圖表數據,查看其標籤的值(「label」:」 * 「),顯示爲亂碼,排除js解析成亂碼的可能。
  · 此時首先想到Java文件讀取過程問題,從官方發佈的源碼包查看源碼 src/core/org/apache/jmeter/report/core/CsvSampleReader ,發現代碼中字符編碼指定爲ISO8859-1:
package org.apache.jmeter.report.core;
//次要內容略...
public class CsvSampleReader implements Closeable{
//次要內容略...
private static final String CHARSET = "ISO8859-1";
//次要內容略...
private CsvSampleReader(File inputFile, SampleMetadata metadata, char separator, boolean useSaveSampleCfg) {
if (!(inputFile.isFile() && inputFile.canRead())) {
throw new IllegalArgumentException(inputFile.getAbsolutePath()
+ " does not exist or is not readable");
}
this.file = inputFile;
try {
this.reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file), CHARSET), BUF_SIZE);
} catch (FileNotFoundException | UnsupportedEncodingException ex) {
throw new SampleException("Could not create file reader !", ex);
}
}
}
  至此,問題緣由得以肯定。
相關文章
相關標籤/搜索