䞀床JMeterず芋知らぬ人に䌚った...



映画「レむクハりス」から撮圱。 ミヌティングwww.kinopoisk.ru



ゞムは、圌女ぞのアプロヌチ方法、䌚話を開始する堎所、話す蚀語をただ知りたせんでした。 しかし、圌は倚くの蚀語を所有し、袖に耇数の切り札がありたした。 そしお、本圓の友人これはあなたず私ですの助けに自信を持ち、疑いを忘れお、私は運呜に䌚いに行きたした。



以䞋は、Jimが䞍慣れなシステムの䞭心をどのように獲埗したかに぀いおの物語です。 䜕人かの芋知らぬ人がいたずは思わないでください。 圌女はただ䞀人でしたが、非垞に異なっおいたした。それから物語は次々に続きたす。



たえがき







なじみのないシステムにリク゚ストを送信するための䞀般的なオプション



なじみのないシステムにリク゚ストを送信するために、次のオプションを䜿甚したした。



  1. 圌は、テスト察象のシステムに芁求を送信できる䞭間Webアプリケヌションを䜜成し、 HTTP芁求コンポヌネントを䜿甚しおWebアプリケヌションにコマンドを送信したした。
  2. テストされたシステムに芁求を送信できる䞭間Webサヌビスを䜜成し、 SOAP / XML-RPC芁求コンポヌネントを䜿甚しおWebサヌビスにコマンドを送信したした。
  3. OS Process Samplerコンポヌネントを䜿甚しおJMeterからクラむアントず呌ばれる、テスト察象のシステム甚のコン゜ヌルクラむアントを䜜成したした。
  4. テスト察象システムを操䜜するためのJavaCでラむブラリAPIを䜜成し、 JSR223サンプラヌコンポヌネントを䜿甚しおラむブラリメ゜ッドを呌び出したした 。
  5. JMeter甚のプラグむンを䜜成したした。


WebアプリケヌションずHTTPリク゚ストたたはWebサヌビスずSOAP / XML-RPCリク゚スト



JMeterはHTTPおよびSOAPリク゚ストを送信できるこずが知られおいたす。 たた、統合の問題を解決するために、テスト察象のシステムにリク゚ストを送信し、 HTTP経由でJMeterからコマンドを受信するWebアプリケヌションを䜜成するオプションがよく遞択されたす。



䟋。 HTTPを介しおSOAP / MSBin1 プロトコルで実行されるwcfサヌビスをテストしたした。 JMeterは SOAP / MSBin1プロトコルを䜿甚できたせん。1぀のパケットで小さなリク゚ストを非垞に読みにくい圢匏で送信できたすが、倧きなリク゚ストを送信したり、倧きなレスポンスを受信したりするこずはできたせん。

最初の゜リュヌションはこれで、 Visual Studioを䜿甚しおテスト察象システムwcfサヌビスのクラむアントを生成し、 HTTP経由でJMeterからコマンドを受信できるテストWebサヌビスを䜜成したした。



たたは、テストシステムにPython APIがある堎合がありたす。 たた、Pythonコヌドを呌び出すために、 JMeterからコマンドを受け取り、システムに負荷を適甚するPython Webアプリケヌションを䜜成できたす。



軜量Webアプリケヌション





テスト察象のシステムに小さな負荷をかけるWebアプリケヌション。 Webアプリケヌションにログむンするこずが重芁です。



Webアプリケヌションを䜿甚する堎合、垞にタむムラグが発生したす。 JMeterず䞭間Webアプリケヌションずの盞互䜜甚時間は、䜎負荷でもれロではありたせん。 したがっお、テスト察象システムのリク゚ストに察する応答時間は、䞭間Webアプリケヌションのログによっお枬定する必芁がありたす。 JMeterで修正されたリク゚スト凊理時間は、意図的に長くなりたす。 したがっお、 JMeterのログず䞭間Webアプリケヌションのログの2぀のログを維持するこずが重芁です。 Webアプリケヌションログを解析し、その統蚈を䜜成できるようにしたす。



負荷の高いWebアプリケヌション





負荷が高いWebアプリケヌションは、マスタヌされおいない堎合、障害点になる可胜性がありたす。



倧きな負荷を䜜成するずき、倚くの堎合、いく぀かのJMeterを実行する必芁がありたす。 侭間Webアプリケヌションが凊理できない可胜性がある倚くの芁求が䜜成されたす。 タむムラグが倧きくなりたす。 負荷が倧きいず、Webアプリケヌションぞのログむンが遅れる堎合があり、テストされたシステムの応答時間を修正するずきに、さらにタむムラグが発生したす。 䞊の図では、䞭間Webアプリケヌションを赀で匷調衚瀺し、ログファむルぞの矢印が点線で瀺されおいたす。



頻繁にテストされるシステムには、ロヌドバランサヌず耇数のアプリケヌションサヌバヌも含たれたす。 クラむアントのIPアドレスに埓っお負荷分散が実行される堎合、1぀の䞭間Webアプリケヌションを䜿甚する堎合、負荷はテスト䞭のシステムのノヌドの1぀のみに適甚されたす。 他のノヌドはアむドル状態になりたす。 䞊の図でそれを把握し、テストしたシステムのノヌドの1぀を赀で匷調衚瀺したした。



倧きな負荷をかける前に、次のこずが重芁です。







倧きな負荷を䜜成するには、耇数のJMeterず耇数の䞭間Webアプリケヌションを䜿甚する必芁がありたす。負荷は均等に分散されたす



耇数のロヌドステヌションがあり、䞭間Webアプリケヌションを介しおロヌドが凊理される堎合。 負荷を凊理するWebアプリケヌションを䜿甚しお、各ロヌドステヌションで個別のWebサヌバヌを実行するず䟿利です。



その埌、テスト察象システムのバランサヌがIPアドレスによるアプリケヌションサヌバヌぞのクラむアントバむンディングを䜿甚しおいる堎合でも、負荷は均等に分散されたす。



Pandasラむブラリ Pythonからを䜿甚しお倚くのログを凊理し、それらの統蚈を生成するず䟿利です。 たた、CSVファむルをすぐに取埗できるように、Webアプリケヌションログを䜜成したす。 このようなCSVファむルは、 MatPlotLibを䜿甚しお、サむクルですぐにダりンロヌド、分析、プロットできたす。 Jupyther 、 Pandas 、およびMatPlotLibはログ凊理の忠実なヘルパヌです。



コン゜ヌルアプリケヌションずOSプロセスサンプラヌ



アプリケヌションの起動を通じお負荷をロヌドするオプションは、次の堎合に正圓化されたす。





クラむアントアプリケヌションの起動によるテスト察象システムの負荷



最初にコン゜ヌルアプリケヌションを介しお負荷を䜿甚したずき、テストでHTTPを介しお100 MBを超え、最倧数ギガバむトのファむルをダりンロヌドする必芁がありたした。 そのような回答を受け取るず、 JMeterは䜿甚可胜なすべおのRAMを消費したした。 Wgetが助けになりたした。このコン゜ヌルツヌルは、巚倧なファむルを簡単にダりンロヌドし、最小限のRAMを消費し、 gzipずキヌプアラむブをオンたたはオフにできる蚭定を備えおいたす。 OSプロセスサンプラヌずwgetは、チャネルをポンピングしおテストを実行するこずを蚱可したしたが、これはHTTPリク゚ストでは実珟できたせんでした。



アプリケヌションを䜿甚する機胜





アプリケヌションが障害点になるこずはありたせん。 それらが機胜する堎合、タむムラグは䞭間WebサヌビスたたはWebアプリケヌションを䜿甚する堎合よりもはるかに短くなりたす。 開発ずデバッグが簡単です。



コン゜ヌルアプリケヌションがスクリプトを巧みに実行するためには、擬䌌コヌドを䜿甚しお暙準入力からのスクリプトの受信をコン゜ヌルアプリケヌションに実装するず䟿利です。 たずえば、これ



#AuthByCertificate "  " #GetInboxDocuments #GetContagentList #SendDocument ".\data\Document1.txt" #SendDocument ".\data\Document2.jpg" #Exit
      
      





このようなシナリオのパヌサヌを䜜成したす。行がで始たる堎合、これがコマンドである堎合、制埡はそのようなコマンドのハンドラヌに転送されたす。 必芁に応じお、ハンドラヌは実行に必芁なパラメヌタヌ、たずえばナヌザヌ蚌明曞の名前やファむルぞのパスを読み取りたす。



そのようなむンタヌフェむスを開発する時間がなければ、スクリプトを関数にラップしお、コマンドラむンパラメヌタヌを介しお関数の名前ずそのパラメヌタヌを簡単に転送できたす。



 ConsoleApp.exe /test1 "  " ".\data\Document1.txt" ".\data\Document2.jpg" ConsoleApp.exe /test2 "UserLogon1" "UserPassword1" ".\data\Document1.txt"
      
      





通垞、シナリオの数は制限されおおり、テストの前に説明されおいたす。 したがっお、このオプションも䟿利です。



OS Process Samplerを䜿甚しお、任意の数のパラメヌタヌを枡すこずができたす。 JMeter倉数を䜿甚しお、CSVファむルからパラメヌタヌを読み取るこずができたす。 しかし、実際には、バッチファむルを蚘述しおコン゜ヌルアプリケヌションを起動する方が䟿利であるこずが瀺されおいたす。 たた、アプリケヌション自䜓ではなく、 OS Process Samplerからバッチファむルを呌び出したす。



スクリプトがテストに結果を返す必芁がある堎合。 この結果のコン゜ヌルぞの出力を文字列ずしお実装するず䟿利です。 JMeter偎では、応答パラメヌタヌを凊理するポストプロセッサを実装したす。



既補のアプリケヌションが䜿甚され、成功および゚ラヌに察しお特定の応答コヌドが返されない堎合。 次に、 OS Process Samplerの操䜜ステヌタスを蚭定するために最䜎限必芁なポストプロセッサが必芁です-アプリケヌションが正垞に完了したかどうか。



wgetを起動し、ポストプロセッサによっおその䜜業結果を凊理する䟋
wgetを䜿甚しお速床制限が蚭定された倧きなファむルをダりンロヌドするためのバッチファむルwget-download.gzip.bat 。 バッチファむルは、1぀のパラメヌタヌを入力ずしお受け取りたす-ダりンロヌドするファむルのアドレス、パラメヌタヌ倀はOS Process Samplerから転送されたす。 テキストwget-download.gzip.bat 



 @title %~nx0 @setlocal @cd /d %~dp0 @rem 100 MBit/sec @rem --progress=dot:default ( 1 KByte per line) @rem --progress=dot:binary (384 KByte per line) @rem --progress=dot:mega ( 3 MByte per line) %~dp0wget/bin/wget.exe -S --limit-rate=20m --progress=dot:mega ^ --header "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0" ^ --header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" ^ --header "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3" ^ --header "Accept-Encoding: gzip, deflate" ^ --output-document=- %1 1>NUL
      
      







JSR223 PostProcessorは、 Groovyスクリプトを䜿甚しおwgetによっおコン゜ヌルに衚瀺される応答を解析し、 OS Process Samplerの適切なフィヌルドに入力しお、応答を分析するためにJMeterログですべおの必芁なデヌタを分析したす。 Groovyを䜿甚するこずは重芁です。Groovyは他のものよりもコンパむルず実行が速いため、 JMeterの蚘事 greatvovanの BeanShell Samplerを忘れおください 。 ハンドラヌテキスト



 // prev - http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html import java.util.regex.Matcher; import java.util.regex.Pattern; //Length: 1718181 (1.6M) [text/html] Pattern pLength = Pattern.compile("(?im)^Length[:] ([0-9]+) "); Matcher mLength = pLength.matcher(prev.getResponseDataAsString()); if(mLength.find()) { int Length = Integer.parseInt(mLength.group(1)); prev.setBodySize(Length); } Pattern pContentType = Pattern.compile("(?im)^[ ]{2}Content[-]Type[:] (.*)"); Matcher mContentType = pContentType.matcher(prev.getResponseDataAsString()); if(mContentType.find()) { String ContentType = mContentType.group(1); prev.setContentType(ContentType); } Pattern pHeaders = Pattern.compile("(?im)^[ ]{2}([a-zA-Z].*[:].*)"); Matcher mHeaders = pHeaders.matcher(prev.getResponseDataAsString()); String headers = ""; while(mHeaders.find()) { headers = headers + mHeaders.group(1) + "\n"; } prev.setResponseHeaders(headers); // HTTP/1.1 200 OK Pattern pCodeMessage = Pattern.compile("(?im)^[ ]{2}HTTP[/]1[.][0-9] ([0-9]+) (.*)"); Matcher mCodeMessage = pCodeMessage.matcher(prev.getResponseDataAsString()); if(mCodeMessage.find()) { String Code = mCodeMessage.group(1); String Message = mCodeMessage.group(2); if(Code=="200") { prev.setSuccessful(true); } else { prev.setSuccessful(false); } prev.setResponseCode(Code); prev.setResponseMessage(Message); }
      
      







ラむブラリずJSR223サンプラヌ







アプリケヌションは正垞に動䜜したすが。 それでも、より少ないリ゜ヌスを費やしたい-プロセスではなくスレッドを䜜成するために、いく぀かのロヌドステヌションずギガバむトのRAMがない堎合がありたす。 JMeter倉数を入力ずしお受け入れたいです。 たた、堎合によっおは、スクリプトを䜜成するずきに、stdinアプリケヌションに擬䌌コヌドを送信するのではなく、柔軟性を高めたいず思っおいたす。



 TestClient client = new TestClient(); String certificateCommonName = vars.get("certificateCommonName"); //"  " String documentPath1 = vars.get("documentPath1"); //".\data\Document1.txt" String documentPath2= vars.get("documentPath2"); //".\data\Document2.jpg" client.authByCertificate(certificateCommonName); client.getInboxDocuments(); client.getContagentList(); client.sendDocument(documentPath1); client.sendDocument(documentPath2); client.exit();
      
      





この堎合、サむクルを䜿甚し、䞀郚のメ゜ッドの結果を他のメ゜ッドの入力に転送し、JMeterずアプリケヌション開発環境を切り替えるこずなく、興味深いロゞックを䜿甚したす。



たたは、仮想ナヌザヌごずに1回だけ認蚌およびログアりトしたす。 たた、 JMeterからの1぀のリク゚ストのフレヌムワヌク内で、远加のタむムラグなしで、テスト䞭のシステムに察しお1぀のリク゚ストのみを実行したす。



そのような方法がありたす-JSR223 Samplerを䜿甚したす。 そこからラむブラリメ゜ッドを呌び出すのが䟿利です。



JSR223サンプラヌには、倚くの䟿利な機胜がありたす。



ラむブラリの3぀のJSR223サンプラヌ初期化、クラむアントの䜜成、システムぞの接続に分割できたす。 そしお、単䞀スレッド仮想ナヌザヌJMeterのフレヌムワヌク内で、操䜜が正垞に完了し、各ステップの時間を枬定できるようになりたす。



テスト察象システムぞのクラむアントの初期化.niのラむブラリ、jni4netを䜿甚しおロヌド。 テストのためにラむブラリを䞀床ロヌドするだけで十分です



 import net.sf.jni4net.Bridge; import java.net.URL; Bridge.init(); Bridge.setDebug(false); Bridge.setVerbose(false); java.io.File clientDllFile = new java.io.File("TestClient.j4n.dll"); Bridge.LoadAndRegisterAssemblyFrom(clientFile);
      
      





個別に、スレッドごずに、テスト察象システムのクラむアントむンスタンスが䜜成されたす。



 import testClient.Client; //   Client client = new Client(); //     "testClient" JMeter vars.putObject("testClient", client); //          //       client String responseData = client;
      
      





そしお、このクラむアントのメ゜ッド、たずえばauthByCertificateを呌び出すこずができたす。



 import testClient.Client; //  ,   Client client = vars.getObject("testClient"); //      String certificateCommonName = vars.get("certificateCommonName"); //"  " //     client.authByCertificate(certificateCommonName);
      
      





jni4netを䜿甚するず、.NETラむブラリメ゜ッドを呌び出すこずができたす。 jniだけを䜿甚しお、Win32ラむブラリメ゜ッドを呌び出すこずができたす。 ラむブラリがすでにJavaで蚘述されおいる堎合、远加のレむダヌは必芁ありたせん。 もちろん、この方法でPython、PHP、bashのコヌドを呌び出すこずはできたせんが、これは必ずしも必芁ではありたせん。



JSR223サンプラヌで䜿甚されるGroovy蚀語を䜿甚するず、コンパむル枈みの高速スクリプトを䜜成できたす。



たた、りェブアプリケヌションやシンプルなアプリケヌションを䜿甚する堎合のように、倧量のログを凊理する必芁はありたせん。 䞭間コンポヌネントの䜿甚によるタむムラグはありたせん。



リ゜ヌス消費が最小限に抑えられたす。 Groovyでコヌドを曞くこずができればよく、Javaに非垞に䌌おいたす。



JMeterプラグむン



コヌドを曞く気がないなら たた、負荷を適甚する堎合、䜕十ものメ゜ッドを実行する必芁はありたせんが、同じタむプの操䜜を䜕癟ものパラメヌタヌ倀で実行する必芁がありたす。 JMeter甚のプラグむンを開発するず䟿利です。 ラむブラリに䌌おいたすが、グラフィカルむンタヌフェむスを備えおいたす。





JMeterのプラグむン



単䞀のログもありたす。 タむムラグはありたせん。 アプリケヌションを切り替えるこずなくパラメヌタヌを蚭定するこずが可胜です。



プラグむンの開発はそれほど難しくありたせん。 シンプルなプラグむンを開発し、既存のプラグむンの機胜を拡匵し、それらを組み合わせたす。 たた、既存のものはプロゞェクトリポゞトリにありたす。



デバッガを䜿甚しお数日間は、プラグむンの開発方法を理解したす。



たずえば、TailSamplerプラグむン蚘事TailSampler-Apache.JMeterでのGETリク゚ストの䞊列送信を参照は、コンポヌネントの組み合わせです



たた、元のコヌドは数癟行しか含たれおいたせん。



商甚プラグむン



それずは別に、商甚プラグむンたたはプラむベヌトプラグむンの開発ず入手のトピックがありたす。 コヌドは垞に曞かれおいる必芁はなく、賌入や䟝頌が簡単な堎合もありたす。 JMeter開発者はアドオンを䜜成したす。 テストおよび開発䌚瀟には、さたざたなツヌル甚の倚数のプラグむンがありたす。



JMeter philmdotの開発者の1人は、サむトubikloadpack.comで、ビデオ、GWT、Java Serialization、FLEXを操䜜するためのプラグむンの4぀のプラグむンを販売しおいたす。



Performance Labの同僚は、 Citrix 、ActiveMQ、Documentum WebTopず連携しおさたざたなサヌビスずプロトコル甚のプラグむンを䜜成したした。 これたでのgithubでは、ほんの少しのコヌドがレむアりトされただけで、始たったばかりです。



確かに、負荷テストプロゞェクトを実斜しおいる他の䌁業にも、既成の実瞟のあるプラグむンがありたす。 誰に連絡したらいいかは蚀いたせん。 しかし、䟋ずしお、私はこれをしたした

  1. 怜玢゚ンゞンに「Tender Load Testing」ずいうフレヌズを入力したした。
  2. Sberbankの入札ぞのリンクを芋぀けたした。
  3. 参加した䌁業のリストを芋おみたしたパフォヌマンスラボ、高床な倉換コンサルティング、Ai-Teco、Aplana、EPAM Systemsなど。


特定のシステムたたは技術のテストのために参加たたは入札した䌁業のいずれかに連絡するず、そのようなシステムたたはプロトコル甚の既補のプラグむン、ナヌティリティ、゚ミュレヌタが提䟛されるず思いたす。 そしお、おそらく、ダりンロヌド、賌入、尋ねるこずができたす。



無料ラむセンスプラグむン



Githubでは、数癟のプラグむンを怜玢できたす。 RabbitMQ 、 Cassandra 、 WebSocket 、 Ajax 、...さたざたなテクノロゞヌ、プロトコル、アプロヌチはすでにJMeterプラグむンで蚀及されおいたす。



ロシア語の説明がある2぀のプロゞェクトで、「JMeter plugin」ずいうフレヌズを怜玢したす。

フレヌズ「JMeter plugin」の怜玢結果168件 。

そしお、「JMeter」ずいうフレヌズを怜玢する際の䜕癟ものプロゞェクト。



衚瀺、ダりンロヌド、アセンブル、テスト、䜜成者からのラむセンスの怜玢、それが指定されおいない堎合はそれを䜿甚しお䜿甚するのが面倒ではないこずが必芁です。



おわりに





映画「レむクハりス」から撮圱。 通信方法www.movpins.com



ゞムは、特別なアプロヌチず秘密の道が必芁な堎合、別の蚀語を話す堎合でも、システムず察話する方法を芋぀けるこずができたす。



普遍的な方法はありたせん。 ある状況では、プラグむンを曞く方が䟿利です。 別の方法では、コン゜ヌルアプリケヌションを䜿甚したす。 Groovy䞊のラむブラリずスクリプトが時々ありたす。 そしお、時々、私は自分のりェブサヌバヌを䞊げたいです。



すべおが可胜です、あなたはただ信じる必芁がありたす。



JMeterで芋぀かった制限ずその察凊方法に぀いお教えおください。



曎新する 圌は商甚およびサヌドパヌティの無料プラグむンのトピックに觊れたした。 特定のプロゞェクトぞの蚀及は匕甚したせんでした。 暙準パッケヌゞに含たれおいないプラグむンの䜿甚経隓がある堎合は、コメントに曞いおください。



All Articles