JMeter3.0圖形化HTML報(bào)告中文亂碼問題處理

由于個(gè)人在JMeter 3.0的實(shí)際應(yīng)用中,腳本中的Test Plan/Sampler等元件命名都沒有使用中文,所以在之前介紹Dashboard Report特性的博客(原文戳這里))成文時(shí)弓熏,沒有提到關(guān)于中文的問題会前。之后有朋友反饋饭聚,Sampler名稱為中文時(shí),生成的報(bào)告中展示為亂碼营搅,自己測試,確實(shí)如此梆砸。

如圖转质,腳本包含兩個(gè)命名為中文的Sampler:


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


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

二. 解決方案

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

基礎(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赤套、將 CsvSampleReader 的 CHARST 賦值為 UTF-8

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

4、編譯該文件珊膜,用得到的 .class 文件替換 JMETER_HOME\lib\ext\ApacheJMeter_core.jar 內(nèi)的原文件容握。當(dāng)然也可以直接對(duì)源碼重新編譯打包,但會(huì)比較費(fèi)時(shí)车柠。

效果如圖:


推薦方案

關(guān)于設(shè)置字符編碼剔氏,一個(gè)更推薦的方案是設(shè)置默認(rèn)字符編碼為UTF-8,同時(shí)支持.properties配置項(xiàng)堪遂。JMeter讀寫結(jié)果文件

(xml/csv)的字符編碼配置項(xiàng)是 ./bin/saveservice.properties 文件內(nèi)的 _file_encoding 介蛉,由

org.apache.jmeter.save.SaveService.getFileEncoding(String dflt)

讀取,當(dāng)沒有在配置相中指定時(shí)溶褪,將使用方法的入?yún)⒆鳛槟J(rèn)編碼币旧,這里我們傳入U(xiǎn)FT-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包替換本地對(duì)應(yīng)jar包输瓜。

· 單獨(dú)的CsvSampleReader.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尤揣,本文的推薦方案即是官方更新中的實(shí)現(xiàn)方式。只是目前官方還沒有發(fā)布更新柬祠,所以自己動(dòng)手北戏。

三. 成因分析

Dashboard Report特性生成HTML圖表,使用JMeter記錄測試結(jié)果數(shù)據(jù)的文件 (命令行執(zhí)行時(shí) -l

指定的文件漫蛔,也可在圖形界面的監(jiān)聽器中指定嗜愈,作為基礎(chǔ)知識(shí)不在這里展開) 作為數(shù)據(jù)源旧蛾,Apache

FreeMarker作為模板引擎,默認(rèn)的模板位于JMETER_HOME\bin\report-template蠕嫁。

·?查看官方說明锨天,確認(rèn)沒有關(guān)于HTML報(bào)告字符編碼的配置項(xiàng)。

·?查看數(shù)據(jù)源文件拌阴,確定文件格式為UTF-8绍绘,文件中的中文正常可讀迟赃,排除數(shù)據(jù)源存在問題的可能陪拘。

·?查看生成的結(jié)果文件,主要數(shù)據(jù)在 指定路徑/content/js/graph.js 纤壁,任選一個(gè)圖表數(shù)據(jù)左刽,查看其標(biāo)簽的值(“l(fā)abel”:” * “),顯示為亂碼酌媒,排除js解析成亂碼的可能欠痴。

·?此時(shí)首先想到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);

}

}

}

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雨席,一起剝皮案震驚了整個(gè)濱河市菩咨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陡厘,老刑警劉巖抽米,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糙置,居然都是意外死亡云茸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門谤饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來标捺,“玉大人,你說我怎么就攤上這事揉抵⊥鋈荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵功舀,是天一觀的道長。 經(jīng)常有香客問我身弊,道長辟汰,這世上最難降的妖魔是什么列敲? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮帖汞,結(jié)果婚禮上戴而,老公的妹妹穿的比我還像新娘。我一直安慰自己翩蘸,他們只是感情好所意,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催首,像睡著了一般扶踊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郎任,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天秧耗,我揣著相機(jī)與錄音,去河邊找鬼舶治。 笑死分井,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霉猛。 我是一名探鬼主播尺锚,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼惜浅!你這毒婦竟也來了瘫辩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赡矢,失蹤者是張志新(化名)和其女友劉穎杭朱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吹散,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弧械,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了空民。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃唐。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖界轩,靈堂內(nèi)的尸體忽然破棺而出画饥,到底是詐尸還是另有隱情,我是刑警寧澤浊猾,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布抖甘,位于F島的核電站,受9級(jí)特大地震影響葫慎,放射性物質(zhì)發(fā)生泄漏衔彻。R本人自食惡果不足惜薇宠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艰额。 院中可真熱鬧澄港,春花似錦、人聲如沸柄沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祖搓。三九已至狱意,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棕硫,已是汗流浹背髓涯。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哈扮,地道東北人纬纪。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像滑肉,于是被迫代替她去往敵國和親包各。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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