JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
圖8 doFileTransfer方法的實現
開發實現了定製化的SSH取樣器和SFTP取樣器之後,可以編寫一個JMeter自動化監控腳本來代替手工執行nmon命令操作。執行JMeter腳本就可以自動實現在設置的監控時段一次性的將多個服務器的nmon監控結果文件下載到本地。
在這個JMeter腳本中,配置項在用戶定義變量中設置(見圖9),將監控的服務器地址、操作系統用戶、密碼,以及nmon文件目錄等參數值放到參數文件中,通過CSV數據文件設置定義變量(見圖10),將對應的nmon命令通過SSH取樣器(見圖11)執行,對應的下載操作通過SFTP取樣器(見圖11)執行。
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
圖8 doFileTransfer方法的實現
開發實現了定製化的SSH取樣器和SFTP取樣器之後,可以編寫一個JMeter自動化監控腳本來代替手工執行nmon命令操作。執行JMeter腳本就可以自動實現在設置的監控時段一次性的將多個服務器的nmon監控結果文件下載到本地。
在這個JMeter腳本中,配置項在用戶定義變量中設置(見圖9),將監控的服務器地址、操作系統用戶、密碼,以及nmon文件目錄等參數值放到參數文件中,通過CSV數據文件設置定義變量(見圖10),將對應的nmon命令通過SSH取樣器(見圖11)執行,對應的下載操作通過SFTP取樣器(見圖11)執行。
圖9 用戶定義變量的設置
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
圖8 doFileTransfer方法的實現
開發實現了定製化的SSH取樣器和SFTP取樣器之後,可以編寫一個JMeter自動化監控腳本來代替手工執行nmon命令操作。執行JMeter腳本就可以自動實現在設置的監控時段一次性的將多個服務器的nmon監控結果文件下載到本地。
在這個JMeter腳本中,配置項在用戶定義變量中設置(見圖9),將監控的服務器地址、操作系統用戶、密碼,以及nmon文件目錄等參數值放到參數文件中,通過CSV數據文件設置定義變量(見圖10),將對應的nmon命令通過SSH取樣器(見圖11)執行,對應的下載操作通過SFTP取樣器(見圖11)執行。
圖9 用戶定義變量的設置
圖10 CSV數據文件設置
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
圖8 doFileTransfer方法的實現
開發實現了定製化的SSH取樣器和SFTP取樣器之後,可以編寫一個JMeter自動化監控腳本來代替手工執行nmon命令操作。執行JMeter腳本就可以自動實現在設置的監控時段一次性的將多個服務器的nmon監控結果文件下載到本地。
在這個JMeter腳本中,配置項在用戶定義變量中設置(見圖9),將監控的服務器地址、操作系統用戶、密碼,以及nmon文件目錄等參數值放到參數文件中,通過CSV數據文件設置定義變量(見圖10),將對應的nmon命令通過SSH取樣器(見圖11)執行,對應的下載操作通過SFTP取樣器(見圖11)執行。
圖9 用戶定義變量的設置
圖10 CSV數據文件設置
圖11 SSH取樣器界面和SFTP取樣器界面
4、總結
當前,上述基於JMeter開發的定製化測試插件已經在實際性能測試項目中實踐應用,解決了一些特定場景下的測試需求。隨著JMeter在性能測試工作中的廣泛應用,針對一些特色測試場景和特定測試需求,測試人員可以擴展開發自己的測試插件並在一定範圍內共享使用,更好的提高性能測試工作效率。
請關注+私信回覆:“學習”就可以免費拿到軟件測試學習資料
JMeter原生支持多種不同的取樣器(HTTP、TCP、JDBC、JMS等),每一種不同類型的取樣器可以向服務器發送不同協議類型的請求。除了開箱即用的協議支持以外,JMeter還支持用戶自己開發新協議的測試插件來進行擴展。
用戶開發定製化的取樣器插件,首先需要開發取樣器的圖形界面,擴展實現JMeter的AbstractSamplerGui類;然後開發取樣器的處理邏輯類,擴展實現JMeter的AbstractSampler類,實現協議交互,發送請求報文並處理返回的響應結果;最後將開發調試好的代碼編譯,與描述了依賴關係的pom.xml一起打成JAR包,拷貝到JMeter的lib\\ext目錄下,其它相關依賴JAR包拷貝到JMeter的lib目錄下。
重啟JMeter後,選擇用戶開發好的定製化取樣器測試插件,輸入相關參數發起請求,即可執行擴展後的定製化測試插件支持的測試。下面詳細說明一些具體定製化測試插件的設計思路和實現過程。
1、定製化的TCP取樣器定製化的TCP取樣器(發送文本字符報文)
JMeter原生支持基於TCP協議的性能測試,提供了TCP取樣器,通常情況下可以滿足大多數基於TCP協議的測試需求。但在有些TCP協議的特定測試場景中無法完全滿足實際的測試需求,比如服務器端返回的報文並沒有一個明確的終止符(在TCP取樣器中設定的"End of line(EOL) byte value"),而是返回一個定長的字節流報文,再比如要求發送的請求報文中含有中文,需要對請求報文進行特定的編碼,JMeter原生TCP取樣器需要在jmeter.properties文件中的tcp.charset屬性設置具體值重啟JMeter後生效,並不十分便捷,沒有提供圖形界面的tcp.charset參數設置項。
通過研讀分析JMeter的源代碼,開發實現定製化的TCP取樣器插件,主要需要擴展實現org.apache.jmeter.config.gui.AbstractConfigGui抽象類、org.apache.jmeter.samplers.gui.AbstractSamplerGui抽象類創建定製化的TCP取樣器界面,並且擴展實現org.apache.jmeter.samplers.AbstractSampler抽象類完成定製化的TCP取樣器發送請求和接收響應信息的處理邏輯,最後擴展org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClient類實現讀取定長返回報文的處理邏輯。
擴展了AbstractConfigGui抽象類的具體類實現了定製化的TCP取樣器配置界面。擴展了AbstractSamplerGui抽象類的具體類實現了定製化的TCP取樣器界面。這兩個GUI類都重寫了圖1中的前三個方法,實現了圖1中的後三個方法。所設計的定製化取樣器GUI的init方法實現詳見圖2。擴展了AbstractTCPClient類的TCPClientImpl2類中實現讀取定長返回報文處理邏輯的read方法詳見圖3。
圖1 GUI類需要實現的方法名
圖2 init方法的實現
圖3 read方法的實現
定製化的TCP取樣器界面(見圖4)在"End of line(EOL) byte value"之後添加了"Length of Receive"和"Charset"2個參數設置項。
如果"End of line(EOL) byte value"和"Length of Receive"同時設置的話,定製化的TCP取樣器會優先使用"End of line(EOL) byte value"的設置值進行判斷,"Length of Receive"的設置值會忽略。
如果只設置了"Length of Receive",會返回指定長度的返回報文,如果指定的長度小於實際的字符流長度,超出指定長度的字符會被截掉。"Charset"設置值如果指定了具體的字符集,將按照指定的字符集編碼發送請求報文,如果沒有指定,按照操作系統默認字符集編碼發送請求報文。
圖4 定製化的TCP取樣器界面(發送文本字符報文)
2、定製化的TCP取樣器
定製化的TCP取樣器(發送16進制字符報文)
在實際性能測試項目中,有時會遇到基於TCP協議的8583報文格式(銀聯基於ISO報文國際標準包格式的通訊協議,用於金融系統之間的報文交換,例如POS交易、ATM交易等)的測試場景。
在這樣的測試場景下,JMeter的原生TCP取樣器除了服務器返回報文長度判斷問題以外,還存在由於返回的8583報文中可能存在多個3030,導致交易結果返回碼(3030)校驗判斷不便的問題。
通過分析,開發實現定製化的TCP取樣器(發送16進制字符報文)插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的TCP取樣器(發送16進制字符報文)界面之外,還需要在擴展實現AbstractSampler抽象類中實現自動校驗指定位返回報文內容判斷的處理邏輯(見圖5)。
圖5 setupSampleResult2方法的實現
定製化的TCP取樣器(發送16進制字符報文)界面(見圖6)在"End of line(EOL) byte value"之後除了添加"Length of Receive"參數設置項以外,增加了"Auto Assertion"勾選項、"StartPosition"和"FindValue"參數設置項。
如果勾選了"Auto Assertion"自動校驗選項,並設置了"StartPosition"和"FindValue"參數,不用手工添加新的響應斷言就可以自動對返回報文指定起始位的返回碼進行校驗判斷,判斷返回碼是否與預期一致,一致的話交易成功,否則交易失敗。
圖6 定製化的TCP取樣器界面(發送16進制字符報文)
3、定製化的SSH取樣器和SFTP取樣器
測試人員在實際性能測試過程中,經常會登錄到遠程Linux服務器上進行一系列的操作(例如執行nmon命令,下載nmon監控結果文件等)。有些nmon操作命令基本上是固定的,但每次登錄到服務器上重複操作會顯得較為繁瑣。尤其是當監控的服務器數量較多時,這些重複操作就顯得十分費時。
開發定製化的SSH取樣器插件和SFTP取樣器插件,利用JMeter支持併發發送請求,編寫一個JMeter自動化監控腳本,用來代替手工執行nmon命令可以很大程度上提高監控操作效率。
開發實現定製化的SSH取樣器插件和SFTP取樣器插件,除了實現AbstractConfigGui抽象類和AbstractSamplerGui抽象類創建定製化的SSH取樣器界面和SFTP取樣器界面之外,還需要擴展實現AbstractSampler抽象類負責命令執行的處理邏輯,而處理邏輯的實現依賴於Jsch。
Jsch是一種支持SSH2協議的純Java實現,可以滿足通過SSH2協議連接到服務器並執行命令,進而執行文件傳輸和文件下載。實現了SSH取樣器處理邏輯的類中編寫了doCommand方法(見圖7)負責處理命令操作。實現了SFTP取樣器處理邏輯的類中編寫了doFileTransfer方法(見圖8)負責處理文件上傳下載操作。
圖7 doCommand方法的實現
圖8 doFileTransfer方法的實現
開發實現了定製化的SSH取樣器和SFTP取樣器之後,可以編寫一個JMeter自動化監控腳本來代替手工執行nmon命令操作。執行JMeter腳本就可以自動實現在設置的監控時段一次性的將多個服務器的nmon監控結果文件下載到本地。
在這個JMeter腳本中,配置項在用戶定義變量中設置(見圖9),將監控的服務器地址、操作系統用戶、密碼,以及nmon文件目錄等參數值放到參數文件中,通過CSV數據文件設置定義變量(見圖10),將對應的nmon命令通過SSH取樣器(見圖11)執行,對應的下載操作通過SFTP取樣器(見圖11)執行。
圖9 用戶定義變量的設置
圖10 CSV數據文件設置
圖11 SSH取樣器界面和SFTP取樣器界面
4、總結
當前,上述基於JMeter開發的定製化測試插件已經在實際性能測試項目中實踐應用,解決了一些特定場景下的測試需求。隨著JMeter在性能測試工作中的廣泛應用,針對一些特色測試場景和特定測試需求,測試人員可以擴展開發自己的測試插件並在一定範圍內共享使用,更好的提高性能測試工作效率。
請關注+私信回覆:“學習”就可以免費拿到軟件測試學習資料