Jmeter 添加CSV Data set config 文件的相對路徑及編碼在Windows和Linux下的兼容性


簡介: 

Jmeter實際上是不需要安裝的,只需要有ApacheJMeter.jar、啟動批處理文件(jmeter.bat或jmeter)、配置文件(jmeter.properties、user.properties、saveservice.properties等)、lib文件(一堆的jar包)就足夠在Windws和Linux下運行了,純綠色並且是輕量級的(總共不到50M就夠用了)。另外Jmeter各個版本中,首先推薦的是Jmeter3.1版本,因為它足夠新,而且同時兼容JDK1.7和1.8(但要注意的是,Server端和Client端還是應該保持統一版本的JDK),更高的版本就不再支持JDK1.7了。

       既然Jmeter能同時在Windws和Linux下運行,那么我們還需要注意什么呢?有兩點,一是路徑關系及路徑符號,二是字符集編碼,解決了這兩個問題,我們就能將Windows下調試通過的Jmeter包(包括jmx腳本)全部復制到Linux下並直接就可以用jmeter啟動文件調用jmx腳本跑起來,甚至連輸出jtl報告、CSV報告、html報告都能完全兼容。

一、路徑問題

1、相對路徑

      Jmeter的相對路徑是指腳本所對應的目錄:

    1.1 如同目錄下java輸入 ./test.cvs  ,Jmeter直接輸入文件名test.cvs,不必輸入 ./

   1.2 如子目錄下 dataFiles\測試數據.csv

 

   1.3 如上級目錄下  ..\dataFiles\測試數據.csv

 

 

 

這個路徑就表示,ID.csv文件對應的絕對路徑是D:\testJmeter\dat\ID.csv。

同樣如果Beanshell中引用了Java的相對路徑如下:

那么就表示對應的絕對路徑是D:\testJmeter\etlCount.java

2、以上舉的例子是在Windows下的,到了Linux下就會報錯,這是因為Linux識別路徑的符號不是反斜桿"\",而是正斜杠"/",而且windows下兼容性是最好的,無論正反斜杠都能識別,所以我們filename應該改為dat/ID.csv,同樣source引用java文件,也可以改成如下:

3、第三個問題,也就是jmx腳本文件到底應該放哪比較好,雖然以上的相對路徑能夠解決換電腦后不需要修改文件路徑了,但還是不夠可靠,這是因為jmeter執行文件是在bin目錄下的,很多時候程序默認是以jmeter的bin目錄為根路徑的,如果參數文件或是java文件的相對路徑不是以bin為開始目錄,很可能在分布式測試時,就出現遠程代理機所調用的文件路徑與本地腳本不一致。

      所以最好的方式是,將jmx腳本統一放在bin目錄下,然后參數文件或是source文件再以腳本的相對路徑進行匹配。比如參數文件的絕對路徑為:D:\testJmeter\bin\dat\ID.csv,這樣相對路徑還會是dat/ID.csv,那么換任何一種環境,或是用任何一種方式調用(比如通過Ant調用)都能保證找到一致路徑下的文件。

      同時,還要確保所有被調用的jar放到lib/ext目錄下(其實放到lib目錄下也行),這樣就不需要配置jar的路徑了,程序會自動找到這個目錄並調用jar包。

總結:相對路徑只是為了方便代碼或腳本的遷移,而將腳本放到bin目錄下,只是方便默認路徑的引用,否則就要通過配置環境變量(如export)或是在build.xml中配置好jmeter的執行目錄、根目錄才能保證路徑的正確性。

4、另外我們在編碼過程中,也有意識的多用一些相對路徑(很多程序都具有這樣的功能,這能為我們省掉一些麻煩),如下:

 

[java]  view plain  copy
 
  1. /** 
  2.    * 獲得excel文件的路徑 
  3.    * @return 
  4.    * @throws IOException 
  5.    */  
  6.   public String getPath(String fileName) throws IOException {  
  7.       File directory = new File(".");  
  8.       sourceFile = directory.getCanonicalPath() + "/DataSource/"  
  9.               + fileName + ".xls";  
  10.       return sourceFile;  
  11.   }  

 

二、字符編碼問題

      只要是在我們的參數文件或是java文件中使用了中文,就避免不了編碼兼容性的問題。我們經常會碰到在Windows下編輯好的文件,到了linux下就顯示中文亂碼,甚至通過Jmeter輸出的日志、發送的請求都成了亂碼。

      解決這個問題的最好方式,是統一編碼,一般我們都是統一采用UTF-8編碼,或者在Linux環境中安裝部署更多的中文支持包。

      如果當我們的參數文件或是Java文件在Linux下讀取時出現亂碼,我們最簡單的一種方式是用在Windows下用編輯器(如UltraEdit)另存為無BOM的UTF-8格式,記住是無BOM的,否則到了Linux環境就會出現編譯錯誤(如果純粹只寫不讀取的文件,是否帶BOM頭就無所謂了)。從這點來說,Windows對編碼格式的處理要比Linux兼容性強(開源的東西,總是要處處踩着坑才能過去)。

      關於Jmeter的編碼問題,可以參照我的另一篇文章 http://blog.csdn.net/smooth00/article/details/70236638

      需要說明的是jmeter響應數據默認編碼格式是ISO-8859-1(向下兼容ASCII,自身不顯示中文,依賴於平台的編碼來顯示中文),Windows默認保存的文件編碼格式是ANSI/ASCII(但Windows默認以GBK來顯示中文),而在Linux我們通常默認以UTF-8編碼格式來顯示中文。所以這三者如果能統一的話,就可以避免亂碼顯示。另外就是很多網站是以UTF-8或gb18030(GBK)編碼來顯示中文的,通過Jmeter來發送郵件時最好注意一下Web展示方面的問題。

      jmeter的配置文件jmeter.properties中可以修改sampler響應數據的編碼:

 

[html]  view plain  copy
 
  1. # The encoding to be used if none is provided (default ISO-8859-1)  
  2. #sampleresult.default.encoding=ISO-8859-1  

     也可以通過后置處理器BeanShell PostProcessor來修改顯示的編碼:

 

      如果我們不想麻煩,就是說不願意去花時間統一linux和windows的中文編碼,那么除了上面提到的手動將文件(如etlCount.java)另存為UTF-8 -無BOM格式,再傳到linux中運行的方法,也可以寫個批處理,將從windows傳過來的文件強制轉為UTF-8格式,具體大家可以靈活應用:

 

[plain]  view plain  copy
 
  1. iconv -f gbk -t utf-8 etlCount.java >etlCount.java.bak  
  2. mv -f etlCount.java.bak etlCount.java  

      最后再說一種情況:同樣是utf-8格式,Linux下創建的文件是不帶BOM頭的,那么到Windows下用相關軟件比如Excel打開就會顯示亂碼,實際上Excel支持utf-8的中文顯示,只是因為沒有BOM頭,所以導致格式判斷和識別錯誤。解決的辦法就是在Java中生成csv之類文件的時候,強制加上BOM頭((byte)0xEF, (byte)0xBB, (byte)0xBF):

 

[java]  view plain  copy
 
  1. File file = new File("output.csv");  
  2. OutputStream out = new FileOutputStream(file);  
  3. out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});  
  4. out.write("date,CountName,業務庫,數據中心,國家庫,result\r\n".getBytes());  
  5. out.close(); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM