? ? ? ?Jmeter實(shí)際上是不需要安裝的,只需要有ApacheJMeter.jar、啟動批處理文件(jmeter.bat或jmeter)、配置文件(jmeter.properties、user.properties、saveservice.properties等)、lib文件(一堆的jar包)就足夠在Windws和Linux下運(yùn)行了,純綠色并且是輕量級的(總共不到50M就夠用了)。另外Jmeter各個版本中,首先推薦的是Jmeter3.1版本,因為它足夠新,而且同時兼容JDK1.7和1.8(但要注意的是,Server端和Client端還是應(yīng)該保持統(tǒng)一版本的JDK),更高的版本就不再支持JDK1.7了。
? ? ? ?既然Jmeter能同時在Windws和Linux下運(yùn)行,那么我們還需要注意什么呢?有兩點(diǎn),一是路徑關(guān)系及路徑符號,二是字符集編碼,解決了這兩個問題,我們就能將Windows下調(diào)試通過的Jmeter包(包括jmx腳本)全部復(fù)制到Linux下并直接就可以用jmeter啟動文件調(diào)用jmx腳本跑起來,甚至連輸出jtl報告、CSV報告、html報告都能完全兼容。
一、路徑問題
1、很多人習(xí)慣用絕對路徑,這樣的話兼容性就很差了,把腳本遷移到另一臺機(jī)器就要重新配置。其實(shí)相對路徑只要應(yīng)用得當(dāng),可以讓腳本的兼容性提升很多。
? ? ? 首先應(yīng)該理解Jmeter的相對路徑是怎么定義的,其實(shí)Jmeter的相對路徑是指腳本所對應(yīng)的目錄,比如腳本jmx在D:\testJmeter下,那么CSV Data Set Config就可以配成以下相對路徑:
這個路徑就表示,ID.csv文件對應(yīng)的絕對路徑是D:\testJmeter\dat\ID.csv。
同樣如果Beanshell中引用了Java的相對路徑如下:
那么就表示對應(yīng)的絕對路徑是D:\testJmeter\etlCount.java
2、以上舉的例子是在Windows下的,到了Linux下就會報錯,這是因為Linux識別路徑的符號不是反斜桿"\",而是正斜杠"/",而且windows下兼容性是最好的,無論正反斜杠都能識別,所以我們filename應(yīng)該改為dat/ID.csv,同樣source引用java文件,也可以改成如下:
3、第三個問題,也就是jmx腳本文件到底應(yīng)該放哪比較好,雖然以上的相對路徑能夠解決換電腦后不需要修改文件路徑了,但還是不夠可靠,這是因為jmeter執(zhí)行文件是在bin目錄下的,很多時候程序默認(rèn)是以jmeter的bin目錄為根路徑的,如果參數(shù)文件或是java文件的相對路徑不是以bin為開始目錄,很可能在分布式測試時,就出現(xiàn)遠(yuǎn)程代理機(jī)所調(diào)用的文件路徑與本地腳本不一致。
? ? ? 所以最好的方式是,將jmx腳本統(tǒng)一放在bin目錄下,然后參數(shù)文件或是source文件再以腳本的相對路徑進(jìn)行匹配。比如參數(shù)文件的絕對路徑為:D:\testJmeter\bin\dat\ID.csv,這樣相對路徑還會是dat/ID.csv,那么換任何一種環(huán)境,或是用任何一種方式調(diào)用(比如通過Ant調(diào)用)都能保證找到一致路徑下的文件。
? ? ? 同時,還要確保所有被調(diào)用的jar放到lib/ext目錄下(其實(shí)放到lib目錄下也行),這樣就不需要配置jar的路徑了,程序會自動找到這個目錄并調(diào)用jar包。
總結(jié):相對路徑只是為了方便代碼或腳本的遷移,而將腳本放到bin目錄下,只是方便默認(rèn)路徑的引用,否則就要通過配置環(huán)境變量(如export)或是在build.xml中配置好jmeter的執(zhí)行目錄、根目錄才能保證路徑的正確性。
4、另外我們在編碼過程中,也有意識的多用一些相對路徑(很多程序都具有這樣的功能,這能為我們省掉一些麻煩),如下:
/**
? * 獲得excel文件的路徑
? * @return
? * @throws IOException
? */
? public String getPath(String fileName) throws IOException {
? ? ? File directory = new File(".");
? ? ? sourceFile = directory.getCanonicalPath() + "/DataSource/"
? ? ? ? ? ? ? + fileName + ".xls";
? ? ? return sourceFile;
? }
二、字符編碼問題
? ? ? 只要是在我們的參數(shù)文件或是java文件中使用了中文,就避免不了編碼兼容性的問題。我們經(jīng)常會碰到在Windows下編輯好的文件,到了linux下就顯示中文亂碼,甚至通過Jmeter輸出的日志、發(fā)送的請求都成了亂碼。
? ? ? 解決這個問題的最好方式,是統(tǒng)一編碼,一般我們都是統(tǒng)一采用UTF-8編碼,或者在Linux環(huán)境中安裝部署更多的中文支持包。
? ? ? 如果當(dāng)我們的參數(shù)文件或是Java文件在Linux下讀取時出現(xiàn)亂碼,我們最簡單的一種方式是用在Windows下用編輯器(如UltraEdit)另存為無BOM的UTF-8格式,記住是無BOM的,否則到了Linux環(huán)境就會出現(xiàn)編譯錯誤(如果純粹只寫不讀取的文件,是否帶BOM頭就無所謂了)。從這點(diǎn)來說,Windows對編碼格式的處理要比Linux兼容性強(qiáng)(開源的東西,總是要處處踩著坑才能過去)。
關(guān)于Jmeter的編碼問題,可以參照我的另一篇文章?http://blog.csdn.net/smooth00/article/details/70236638
? ? ? 需要說明的是jmeter響應(yīng)數(shù)據(jù)默認(rèn)編碼格式是ISO-8859-1(向下兼容ASCII,自身不顯示中文,依賴于平臺的編碼來顯示中文),Windows默認(rèn)保存的文件編碼格式是ANSI/ASCII(但Windows默認(rèn)以GBK來顯示中文),而在Linux我們通常默認(rèn)以UTF-8編碼格式來顯示中文。所以這三者如果能統(tǒng)一的話,就可以避免亂碼顯示。另外就是很多網(wǎng)站是以UTF-8或gb18030(GBK)編碼來顯示中文的,通過Jmeter來發(fā)送郵件時最好注意一下Web展示方面的問題。
? ? ? jmeter的配置文件jmeter.properties中可以修改sampler響應(yīng)數(shù)據(jù)的編碼:
# The encoding to be used if none is provided (default ISO-8859-1)
#sampleresult.default.encoding=ISO-8859-1
? ? ?也可以通過后置處理器BeanShell PostProcessor來修改顯示的編碼:
? ? ? 如果我們不想麻煩,就是說不愿意去花時間統(tǒng)一linux和windows的中文編碼,那么除了上面提到的手動將文件(如etlCount.java)另存為UTF-8 -無BOM格式,再傳到linux中運(yùn)行的方法,也可以寫個批處理,將從windows傳過來的文件強(qiáng)制轉(zhuǎn)為UTF-8格式,具體大家可以靈活應(yīng)用:
iconv -f gbk -t utf-8 etlCount.java >etlCount.java.bak
mv -f etlCount.java.bak etlCount.java
?最后再說一種情況:同樣是utf-8格式,Linux下創(chuàng)建的文件是不帶BOM頭的,那么到Windows下用相關(guān)軟件比如Excel打開就會顯示亂碼,實(shí)際上Excel支持utf-8的中文顯示,只是因為沒有BOM頭,所以導(dǎo)致格式判斷和識別錯誤。解決的辦法就是在Java中生成csv之類文件的時候,強(qiáng)制加上BOM頭((byte)0xEF, (byte)0xBB, (byte)0xBF):
File file = new File("output.csv");
OutputStream out = new FileOutputStream(file);
out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});
out.write("date,CountName,業(yè)務(wù)庫,數(shù)據(jù)中心,國家?guī)?result\r\n".getBytes());
out.close();