2017-02-23 52 views
1

WebSocketを介してアプリケーションにパブリッシュ/サブスクライブモデルを構築し、データが変更されたときにユーザーが「動的更新」を受け取れるようにしました。私は今、JMeterを使ってこれをテストしてロードしようとしています。JMeter WebSockets Publish/Subscribe - 非同期応答のスクリプティング

WebSocketの "公開された"メッセージの受信に反応し、さらにサンプラーを実行する、つまりさらなるWeb要求を行うためにJMeterテストを構成する方法はありますか?

私はプラグインサンプルを見ましたが、パブリッシュ/サブスクライブではなくリクエスト/リプライモデル(例:https://bitbucket.org/pjtr/jmeter-websocket-samplers)に焦点を当てているようです。

編集:

私はWebSocketSamplerを使用して、このためのソリューションを進んでいる - メッセージを公開ハンドル、購読、例JMXファイルは、WebSocketをかけSTOMPを使用して接続を含みon BitBucketを見つけることができるからJMeterのサンプラーを開始それ。

+0

ZebraTesterをお試しください。それは、ZebraTestが非同期(コールバック)スタイルの使用をサポートすることを知っているなら、JMeterが(プラグイン経由で)WebSocketをサポートしていることを確認します。 – Vinit

+1

@Vinitありがとうございます。私たちは既にJMeterに時間などを投資してきたので、私はその仕事を最初にすることができるかどうかを見たいと思っています。 – Dazed

+0

ウェブソケット上のMQTTについては、今後のバージョンのZebraTesterで利用可能になります。 – Vinit

答えて

1

それはhttps://bitbucket.org/pjtr/jmeter-websocket-samplers/overviewプラグインは唯一の要求 - 応答モデルの会話をサポートしていること誤解です。

バージョン0.7以降、このプラグインは「シングルリード」サンプラーと「シングルライト」サンプラーを提供します。もちろん、あなたの正確なプロトコルにもよりますが、 "シングル書き込み"サンプラーを使用してサブスクリプションの作成をシミュレートしたWebSocketメッセージを送信してから、(標準のJMeter)Whileループを "single 「サンプラー」を読んで、公開されているメッセージをいくつでも読むことができます。

これがあなたのニーズを満たしていない場合は、私に教えてください。私はあなたのために何ができるのかを見ていきます(私はこのプラグインの作者です)。

+0

私はそれを逃していた - 私は詳細を見てみましょう。 – Dazed

+0

質問に応じて編集 - WebSocketSamplerを使用してメッセージ受信時にJMeterサンプラーを開始するように進めてきました。これを私の質問の答えとして受け入れます。 – Dazed

0

基本的に、JMeterは非同期型のテスト対象システムとの相互作用には適していません。

スクリプトコンポーネント(ポストプロセッサー、タイマー、アサーション、おそらくサンプラーは、あなたのケースでは最も役立つように見えます)とJMeterロジックコントローラーでは(事実上)すべてが可能です。

Ifブロックでカバーされている "さらなるサンプラー"を並べて、 "WebSocket公開メッセージの受信"を分析し、Ifブロックのフラグ変数/その他のパラメータを設定することができます。

スレッドを同期することもできます。必要に応じてthis answerをチェックしてください。

しかし、何をすればいいのかは、手書きのようなものがたくさんあるように見えます。

したがって、カスタム手書きテストハーネス全体も考慮する必要があります。

+0

ありがとう同じ行(詳細に掘り下げなかった)は、私が何かを逃したことを望んでいただけだった。私はあなたがリンクする "スレッド間"オプションを見ていきます。 – Dazed

0

私はSTOMPのシステムを持っていました。クライアントはHTTPメッセージを実行し、このサブスクライブモデルを使用して非同期WebSockets経由で実際の状態を取得しました。この動作をエミュレートするために、私はJMeterContext経由変数はJMeterのスレッドとデータを交換することができ、クラスを書いた(輸入部品は、あなたが自分で輸入org.springframeworkを見つけることができますが*。):

public class StompWebSocketLoadTestClient { 

public static JMeterContext ctx; 
public static StompSession session; 

public static void start(JMeterContext ctx, String wsURL, String SESSION) throws InterruptedException { 
    WebSocketClient transport = new StandardWebSocketClient(); 

    WebSocketStompClient stompClient = new WebSocketStompClient(transport); 
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); 
    threadPoolTaskScheduler.initialize(); 
    stompClient.setTaskScheduler(threadPoolTaskScheduler); 
    stompClient.setDefaultHeartbeat(new long[]{10000, 10000}); 
    stompClient.setMessageConverter(new ByteArrayMessageConverter()); 
    StompSessionHandler handler = new MySessionHandler(ctx); 
    WebSocketHttpHeaders handshakeHeaders = new WebSocketHttpHeaders(); 
    handshakeHeaders.add("Cookie", "SESSION=" + SESSION); 
    stompClient.connect(wsURL, handshakeHeaders, handler); 
    sleep(1000); 
} 

メッセージは、このクラスで処理された:

JMeterのの試験プランで
private static class MySessionHandler extends StompSessionHandlerAdapter implements TestStateListener { 

    private String Login = ""; 
    private final JMeterContext ctx_; 

    private MySessionHandler(JMeterContext ctx) { 
     this.ctx_ = ctx; 
    } 

    @Override 
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) { 
     session.setAutoReceipt(true); 
     this.Login = ctx_.getVariables().get("LOGIN"); 
     //System.out.println("CONNECTED:" + connectedHeaders.getSession() + ":" + session.getSessionId() + ":" + Login); 
     //System.out.println(session.isConnected()); 
     **//HERE SUBSCRIBTION:** 
     session.subscribe("/user/notification", new StompFrameHandler() { 

      @Override 
      public Type getPayloadType(StompHeaders headers) { 
       //System.out.println("getPayloadType:"); 
       Iterator it = headers.keySet().iterator(); 
       while (it.hasNext()) { 
        String header = it.next().toString(); 

        //System.out.println(header + ":" + headers.get(header)); 
       } 
       //System.out.println("================="); 
       return byte[].class; 
      } 

      @Override 
      public void handleFrame(StompHeaders headers, Object payload) { 
       //System.out.println("recievedMessage"); 
       NotificationList nlist = null; 
       try { 
        nlist = NotificationList.parseFrom((byte[]) payload); 

        JMeterVariables vars = ctx_.getVariables(); 
        Iterator it = nlist.getNotificationList().iterator(); 
        while (it.hasNext()) { 
         Notification n = (Notification) it.next(); 
         String className = n.getType(); 
         //System.out.println("CLASS NAME:" + className); 

         if (className.contains("response.Resource")) { 
          ///After getting some message you can work with jmeter variables: 
          vars.putObject("var1", var1); 
          vars.put("var2",String.valueOf(var2)); 
         } 
         //Here is "sending" variables back to Jmeter thread context so you can use the data during the test 
         ctx_.setVariables(vars); 
         n = null; 

        } 
       } catch (InvalidProtocolBufferException ex) { 
        Logger.getLogger(StompWebSocketLoadTestClient.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     }); 
    } 

、ログイン段階の後、私はちょうどログイン/パスワードおよびセッションの文字列とBeanShellのサンプラーとJMeterのスレッドコンテキストを追加しました:

import jmeterstopm.StompWebSocketLoadTestClient; 
StompWebSocketLoadTestClient ssltc = new StompWebSocketLoadTestClient(); 
String SERVER_NAME = vars.get("SERVER_NAME"); 
String SESSION = vars.get("SESSION"); 
String ws_pref = vars.get("ws_pref"); 
ssltc.start(ctx,ws_pref+"://"+SERVER_NAME+"/endpoint/notification- ws/websocket",SESSION); 

さらに簡単なでのWebSocketのデータを介してすべての着信を使用することが可能であるが、変数をvarsの:

Object var1= (Object) vars.getObject("var1"); 
+0

非常に興味深いように見える - 私たちはまたSTOMPを使用している可能性があります。私は "ハンドラ"を介してコールバックを参照しています。そこにはJMeter変数の設定が表示されていますが、私が苦労しているのは、これがさらなるアクティビティを引き起こす方法です。つまり、サンプルをサンプルに注入する方法です。 APIからHTTP経由でこれはLoopControl(接続)を必要とし、初回ラウンドで最初のページ要求に接続して送信し、データ変数セット(つまりメッセージを受け取った)がリフレッシュを発行するかどうかを確認します。 – Dazed

+0

あなたの質問は完全には解決しませんでしたが、この例との接続を確立した後、この日光のチャンネルに来るデータはすべて、vars経由でjmeterサンプラーで使用できるようになります。 – v0devil

+0

本当にありがとうございます。私の質問は、実際には複数のパブリッシュレスポンスを処理するためのJMeterコントロール構造についてのものでしたが、うまくいくと思います。 – Dazed

関連する問題