Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Recommendation_of_Gatling.pdf

cupper
July 10, 2020

 Recommendation_of_Gatling.pdf

cupper

July 10, 2020
Tweet

More Decks by cupper

Other Decks in Technology

Transcript

  1. あんただれ? • 名前    :川嶋 一寿 • チーム   :sst(sstってなんのこと?) • 生息地   :静岡県静岡市 • 趣味    :酒、ジョギング

    • 好きな言語 :Scala • その他   :専門学校講師、Scalapediaの記事執筆 • Twitter   :@cupperservice
  2. Problem 1 手動でユーザー数を変更しrps, response time, cpu利用率等を観測しながら同時に 実行するユーザー数の限界値を決めるため、測定に多くの時間を必要とした。 以下の手順で限界性能を測定していた。 1. 以前の計測結果からユーザー数を決定して測定

    (測定時間: 1分程度) 2. CPUに余裕があり、レイテンシーが悪化していなければユーザー数を増やして再度 測定 3. CPUに余裕がなかったり、レイテンシーが悪化した場合は、ユーザー数を減らして 再度測定 4. 一番性能が良いユーザー数で再度測定 (測定時間: 10分程度)
  3. Problem 4 Pythonのインデント構文が肌に合わない @task(1) def scenario1(self): response = self.login("login_id00", "password00")

    token = response["token"] print(token) self.logout(token) こういうの書けない Dottyはインデント構文サポートするんだよね。。。
  4. 商用利用 • OSS版とEnterprise版がある • OSS版のライセンスはApache 2.0 • OSS版で利用できない機能 ◦ 分散モード

    ◦ モニタリング項目(TCP connection, DNS resolutions, ...) ◦ ライブレポート ◦ 実行履歴の管理 ◦ LDAP認証 ◦ 他
  5. シナリオ シナリオはScalaで記述する package cupper.scenario import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._

    class FirstTest extends Simulation { val protocol = http .baseUrl(http://localhost:3000) .headers(Map( HttpHeaderNames.ContentType -> HttpHeaderValues.ApplicationJson, HttpHeaderNames.UserAgent -> "gatling" )) val user1 = scenario("first test") .exec(http("get movies") .get("/movies") .check(status.is(200)) ) setUp(user1.inject(rampUsers(1000) during(30 seconds)).protocols(protocol)) }
  6. Closed/Open Workload Models • Closed Workload Model 一定数のユーザーが連続的にリクエストを発行するケース。 同じユーザーからのリクエストは、前のリクエストが完了した後に発行される。 社内システムなど同時ユーザー数を制限するシステムに対するテストで有効

    • Open Workload Model システムが現在処理しているリクエスト数に関係なくユーザーがリクエストを発行す るケース。 同時ユーザー数を宣言できないシステムに対するテストで有効 多くの一般向けのWebサイトのテストで有効
  7. 怖がらなくても大丈夫! • とっても簡単(Easy) • モナドとか圏論とかわからなくても大丈夫 公式ページにも下のように書かれている Gatling simulation scripts are

    written in Scala, but don’t panic! You can use all the basic functions of Gatling without knowing much about Scala. In most situations the DSL will cover most of your needs and you’ll be able to build your scenarios.
  8. Sample code package cupper.scenario import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._

    class FirstTest extends Simulation { val protocol = http .baseUrl(http://localhost:3000) .headers(Map( HttpHeaderNames.ContentType -> HttpHeaderValues.ApplicationJson, HttpHeaderNames.UserAgent -> "gatling" )) val user1 = scenario("first test") .exec(http("get movies") .get("/movies") .check(status.is(200)) ) setUp(user1.inject(rampUsers(1000) during(30 seconds)).protocols(protocol)) } ベースURL 共通のリクエストヘッダー テストシナリオ リクエストURL レスポンスの確認 シナリオのシミュレーション 30秒間で1,000ユーザーがシナリ オを実行する Simulationをextends
  9. Main concepts Name Description Virtual User シナリオを実行するユーザーを表す 独自のデータ(パラメータやCookieなど)を持つ Scenario ユーザーの行動を表す一連の操作を記述する

    Simulation どのように負荷をかけるのかを記述する Session ユーザーごとのデータ Feeders 外部(ファイルなど)からSessionにデータを注入する Checks レスポンスをチェックしたり、チェック結果を Sessionに格納する Assertions テストの成否条件を記述する
  10. シナリオ テスト対象は以下のシナリオ オープンモデルで限界値を測定する 1. ECサイトにログイン 2. 商品を検索 3. 商品の内容を確認 4.

    ショッピングカートに登録 5. 購入 or 取り消し 6. ログアウト Github: https://github.com/cupperservice/gatling-sample
  11. 必要なソフトのインストール Gatlingを実行するには以下が必要 • Java 64 bit Open JDK 8 ro

    Open JDK 11 • sbt 0.13.6以上 今回はSDKMANを使ってインストールする
  12. Session is immutable Sessionはimmutable exec(session => { session.set(“key1”, “value1”) session.set(“key2”,

    “value2”) }) exec(session => { session .set(“key1”, “value1”) .set(“key2”, “value2”) }) exec(session => { session.setAll( (“key1” -> “value1”), (“key2” -> “value2”)) }) NGなコード key1の値は無効 OKなコード