base64でオンザフライでエンコードし、BeanShellを使用してJMeterからMongoDBを撮影します

私は比較的短時間ストレステストに取り組んできましたが、私の主なツールの1つはApache Jmeterです。 ただし、私の同僚のほとんどはJMeterでBeanshellを使用していなかったため、この記事では、テスト自体の準備にかかる時間を単純化して短縮する方法をいくつか示します。 そして、テキストをbase64エンコードに変換し、MongoDBで簡単に起動する例でこれを示します。





まえがき



この記事は、すでにJMeterを使用した経験があるが、BeanShellを使用しなかった人を対象としています。そのため、何か理解できない場合は、お気軽にお問い合わせください。



Beanshellとは何ですか、なぜ必要なのですか?



JMeterは、Javaで記述されたオープンソースの負荷テストツールです。 サンプラー(撮影するオブジェクト)を簡単に埋め込むことができますが、このためにはIDEを開き、JMeterパッケージからクラスを継承し、4つのメソッドを記述する必要があります。 エクスポートjar。 そして貼り付けます。 そして、ボタン、チェックボックス、すべてすべてを備えた、このすべてのための別の美しいラッパーを作成する必要があります。



さて、豆の殻とは何ですか、なぜ必要なのですか? BeanshellはJavaインタープリターです。 beanshellを使用すると、テスト中に実行されるJMeterでJavaコードを直接記述できます。



Java? 通訳? 負荷試験 これは冗談ですか?



インタープリターを使用すると、このアプローチのすべてのマイナス面と利点を理解する必要があります。 主な欠点は、インタープリターのパフォーマンスです。 コンパイルするサンプラーの下に常にあります。 利点-開発の速度。 サンプラーのプロトタイプはいつでもBeanshellでスケッチすることができ、すでにパフォーマンスに達した場合は、すべてのロジックを本格的なサンプラーに投入します。



さらに、beanshellでは、サンプラーだけでなく、プリプロセッサ(ショットの前にアクションを実行)、ポストプロセッサー(ショットの後にアクションを実行)およびリスナー(すべてのショットサンプラー/トランザクションに関するレポートを受信)を作成できます。



それはすばらしく聞こえますが、なぜ多くの人々がJMeterについて知っていて、通訳についてほとんど知らないのですか? 問題はすべてドキュメントにあります。つまり、その不在です。 ウィキには1ページ説明があり1ページ例があります。



Base64の例



base64エンコーディングでメッセージを送信することで互いに通信する2つのサービスがあるとします。 私たちのタスクは、これらのサービスの1つをロードすることです。 あるメッセージから別のメッセージを送信する必要があります。 もちろん、すぐにbase64エンコードでデータプールを収集することもできますが、テスターに​​とって、それを扱うのは非常に不便です。 私たちにとって意味のある、馴染みのある形式のデータプールを持ち、情報がすでに必要なエンコーディングでサーバーに送られるようにしたいと思います。 さらに、データプールさえ持っていない場合もあります。 サービス自体が情報を提供し、それを使用して新しいリクエストを送信する場合。



サービス(http://base64.nomanlab.org/?key=base64_key)があり、GETパラメーターの形式で値を渡す必要があります。 例としてサービスを上げました。 記事の公開時には、それは機能します、あなたは遊び回ることができますが、私は心から彼を殺さないようにお願いします、ロードテスター=)



最初に、ユースケースのテスト計画をコンパイルしましょう。 スレッドグループとHTTPリクエストを追加します。 テスト計画は次のようになります。





キー(base64_key)は個別に説明されています。たとえば、ユーザー定義変数を使用して名前キーを付けました。





HTTPリクエスト自体は次のようになります。





ただし、カートリッジ内のデータを使用して撮影する前に、何かを行う必要があります。 したがって、beanshellプリプロセッサを選択し、httpリクエストの子として追加します。 そして、その中にJavaコードを書きます。 Javaコード? しかし、彼はどのように私たちのカートリッジに関連付けられますか? これには、テスト計画とインタープリターのコードをリンクするオブジェクトがあります。





ここでキー変数を置き換えているため、それにアクセスする必要があります。 このスレッドの値は、varsオブジェクトに格納されます(マップのようなものです)。

Javaコード:

//   ,      Apache JMeter import org.apache.commons.codec.binary.Base64; // ,   / Base64 magicBox = new Base64(); //   ,   String key = new String (magicBox.encodeBase64(vars.get("key").getBytes())); //      vars.put("key", key);
      
      









結果は次のとおりです。





キーは、base64エンコーディングの値に置き換えられました。 サービスからbase64で応答を取得し、それを解析する必要がある場合は、最初にポストプロセッサの正規表現抽出を使用してメッセージを取り出し、次に同じ方法でBeanShellポストプロセッサで処理します。 コードは次のようになります。

 //   ,      Apache JMeter import org.apache.commons.codec.binary.Base64; // ,   / Base64 magicBox = new Base64(); //   ,   String key = new String (magicBox.decodeBase64(vars.get("key").getBytes())); //      vars.put("key", key);
      
      









MongoDBの例



そして今、だから誰もがここに来ました。 MongoDBでの撮影。 MongoDBの読み込みに同様の方法を使用できるのは、mongの制限を理解するために遅いクエリで撮影する必要がある極端な場合のみです。



接続プール



撮影するには、これを行うオブジェクトが必要です。 接続の数とそのパラメーターを管理する特定のオブジェクトが必要です。 そして、これらの接続を起動する前に、接続を起動および設定するロジックを共有する必要があります。 テストの前に開始する必要がある別のThreadGroupにインストールをインストールします。 このため、「スレッドグループの設定」を選択します。 semlerを1回だけ実行するようにオプションを設定し、もちろんBeanShell Sampler自体も実行します。 そして、次のコード:

 import com.mongodb.DB; import com.mongodb.Mongo; import com.mongodb.MongoOptions; import com.mongodb.ServerAddress; //bsh.shared      beanshell  bsh.shared.mongo = null; bsh.shared.mongoOptions = new MongoOptions(); bsh.shared.db = null; //    bsh.shared.mongoOptions.autoConnectRetry = true; bsh.shared.mongoOptions.connectionsPerHost = 50; bsh.shared.mongoOptions.socketKeepAlive = true; bsh.shared.mongoOptions.socketTimeout = 10000; // precise-mongodb-amd64    bsh.shared.mongo = new Mongo(new ServerAddress("precise-mongodb-amd64", 27017), bsh.shared.mongoOptions); //   test   bsh.shared.db = bsh.shared.mongo.getDB("test"); if(bsh.shared.db.getStats().ok() == false) { System.err.println("MongoDB Connection error"); }
      
      









撃て!



これで、射撃できるオブジェクトができました。それを使用するサンプラーを作成する必要があります。

テスト計画は次のようになります。





ステータス(DB.getStats()。Ok())を確認するために撮影したところ、BeanShellではなく、1つのmongaコアに遭遇しました。これをローカルラップトップ上のKVMに渡しました。

次のコードを使用して、別個のThreadGroupを作成し、その中にBeanShell Samplerを作成します。

 import com.mongodb.DB; if(bsh.shared.db.getStats().ok() == true) { IsSuccess = true; }else IsSuccess = false;
      
      







そしてもちろん、私たちのパフォーマンスを示す美しいグラフィック。









最後に1つの障害が表示されますが、これは手動でテストを完了したためです。



ただし、DBにアクセスすると、コレクションオブジェクト(DBCollection)を作成して、それを操作できます。 挿入したり、selectsな選択をしたりできます。 MongoDBJava APIを知っている必要があります



しかし、実際には、mongaやその他のデータベースをテストするために、独自の本格的なサンプラーを作成する方が適切です。 私はあなたがそれらなしでできることを示したかっただけです。



ファイル



Base64でテスト計画をダウンロードする

mongaでテスト計画をダウンロードする





エピローグ



IDEに入ることなく、シンプルなアクションでこのようなことを行うと、多くの興味深いことができます。




All Articles