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

Image: discovermagazine.com/

之前在博客中介紹了JMeter 3.0版本新特性:Dashboard Report,用于為JMeter測試結(jié)果生成多維度的圖形化HTML報告,包括聚合報告、吞吐量趨勢圖、平均響應(yīng)時間趨勢圖等十多種圖表,為我們性能測試的結(jié)果分析和報告輸出提供了很多便利。
本文主要介紹如何解決JMeter腳本中取樣器(Sampler)名稱定義為中文時,生成的HTML報告中中文展示為亂碼的問題。

一. 問題概述

由于個人在JMeter 3.0的實際應(yīng)用中,腳本中的Test Plan/Sampler等元件命名都沒有使用中文,所以在之前介紹Dashboard Report特性的博客(原文戳這里)成文時,沒有提到關(guān)于中文的問題。之后有朋友反饋,Sampler名稱為中文時,生成的報告中展示為亂碼,自己測試,確實如此。
如圖,腳本包含兩個命名為中文的Sampler:


執(zhí)行測試后,生成的Dashboard Report圖表中文亂碼:


于是通過查看官方文檔和源碼,找到原因并進(jìn)行了解決,原打算直接追加到之前那篇文章,但考慮到篇幅過長,于是決定新成一文,然后在之前的文章中補(bǔ)充鏈接。

二. 解決方案

先上解決方案:修改JMeter report模塊讀取數(shù)據(jù)源碼中的字符集設(shè)置為UTF-8,編譯后替換到JMETER_HOME\lib\ext\ApacheJMeter_core.jar內(nèi),這里會分享一個我處理好的一個jar包,但建議自己親自動手:

基礎(chǔ)方案

  1. 在官網(wǎng)下載頁面下載apache-jmeter-3.0_src.zip
  2. 相關(guān)源碼位置:
    apache-jmeter-3.0/src/core/org/apache/jmeter/report/core/CsvSampleReader.java
  3. CsvSampleReaderCHARST賦值為UTF-8
private static final String CHARSET = StandardCharsets.UTF_8.displayName();
  1. 編譯該文件,用得到的.class文件替換JMETER_HOME\lib\ext\ApacheJMeter_core.jar內(nèi)的原文件。當(dāng)然也可以直接對源碼重新編譯打包,但會比較費時。

效果如圖:

推薦方案

關(guān)于設(shè)置字符編碼,一個更推薦的方案是設(shè)置默認(rèn)字符編碼為UTF-8,同時支持.properties配置項。JMeter讀寫結(jié)果文件(xml/csv)的字符編碼配置項是./bin/saveservice.properties文件內(nèi)的_file_encoding,由org.apache.jmeter.save.SaveService.getFileEncoding(String dflt)讀取,當(dāng)沒有在配置相中指定時,將使用方法的入?yún)⒆鳛槟J(rèn)編碼,這里我們傳入UFT-8作為默認(rèn)格式,因此將基礎(chǔ)方案中的步驟3做如下變更:

private static final String CHARSET = SaveService.getFileEncoding(StandardCharsets.UTF_8.displayName());

編譯后替換即可。saveservice.properties文件的_file_encoding默認(rèn)已配置為UTF-8,多數(shù)情況下,我們不需要修改。

文件分享

分享的文件和jar包是使用推薦方案進(jìn)行處理。可以取用class文件自己替換進(jìn)本地的ApacheJMeter_core.jar,也可以直接下載分享的jar包替換本地jar包。

  • 單獨的.class文件:https://pan.baidu.com/s/1bo10QnX,提取碼ee68
  • 處理完畢的ApacheJMeter_core.jar: https://pan.baidu.com/s/1mhKLwgw,提取碼id7h

注:github上可以看到j(luò)meter的trunk分支已經(jīng)將dashboard report的默認(rèn)字符編碼更改為UFT-8,本文的推薦方案即是官方更新中的實現(xiàn)方式。只是目前官方還沒有發(fā)布更新,所以自己動手。

三. 成因分析

Dashboard Report特性生成HTML圖表,使用JMeter記錄測試結(jié)果數(shù)據(jù)的文件(命令行執(zhí)行時-l指定的文件,也可在圖形界面的監(jiān)聽器中指定,作為基礎(chǔ)知識不在這里展開)作為數(shù)據(jù)源,Apache FreeMarker作為模板引擎,默認(rèn)的模板位于JMETER_HOME\bin\report-template。

  • 查看官方說明,確認(rèn)沒有關(guān)于HTML報告字符編碼的配置項。
  • 查看數(shù)據(jù)源文件,確定文件格式為UTF-8,文件中的中文正常可讀,排除數(shù)據(jù)源存在問題的可能。
  • 查看生成的結(jié)果文件,主要數(shù)據(jù)在指定路徑/content/js/graph.js,任選一個圖表數(shù)據(jù),查看其標(biāo)簽的值("label":"***"),顯示為亂碼,排除js解析成亂碼的可能。
  • 此時首先想到Java文件讀取過程問題,從官方發(fā)布的源碼包查看源碼src/core/org/apache/jmeter/report/core/CsvSampleReader,發(fā)現(xiàn)代碼中字符編碼指定為ISO8859-1:
package org.apache.jmeter.report.core;
//次要內(nèi)容略...
public class CsvSampleReader implements Closeable{
    //次要內(nèi)容略...
    private static final String CHARSET = "ISO8859-1";
    //次要內(nèi)容略...
    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);
      }
    }
}

至此,問題原因得以確定。

四. 總結(jié)

本文主要介紹使用JMeter 3.0新特性生成HTML圖形化報告時,中文標(biāo)簽展示為亂碼的現(xiàn)象,成因以及簡單解決方案。另外,github上JMeter的trunk分支已經(jīng)有相應(yīng)更新,預(yù)計在下一次版本發(fā)布中,該問題應(yīng)該可以得到修復(fù)。

References

  1. devguide-dashboard
  2. github-apache/jmeter
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容