<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Locust入門及最佳實踐

      官方文檔:https://docs.locust.io/en/stable/

      基礎demo

      from locust import HttpUser, task
      
      
      class HelloWorldUser(HttpUser):
          @task
          def hello_world(self):
              self.client.get("/hello")
              self.client.get("/world")
      

      最佳實踐

      • 斷言:
        在 Locust 中,默認情況下,如果 HTTP 響應狀態碼是 2xx,請求會被標記為成功;否則會被標記為失敗

      • SequentialTaskSet和TaskSet的區別:
        TaskSet 是 Locust 的一個基本類,用于定義用戶行為。
        SequentialTaskSet 是 TaskSet 的子類,它會按照任務定義的順序依次執行任務,每個任務執行完后才會執行下一個任務。

      • task:
        方法上添加 @task 裝飾器來定義用戶任務。

      • 定義負載形狀:

        1. LoadTestShape自動化控制(使用該方式將無法通過WebUI手動控制)
          用于定義負載形狀,即用戶數量和請求頻率的變化規律??梢酝ㄟ^繼承 LoadTestShape 類并重寫 tick 方法來自定義負載形狀。
          tick 方法會在每個時間間隔內被調用,返回一個元組 (users, spawn_rate),表示當前的用戶數量和每秒啟動用戶數。
        2. 使用 WebUI 手動調整
          在壓測過程中,隨時點擊右上角的 "+" 或 "-" 按鈕 增加 / 減少用戶數。
      • HttpUser:
        用于定義 HTTP 用戶類.每個 HttpUser 實例代表一個用戶,它會執行定義的任務。

        1. host: 指定請求的基礎URL
        2. wait_time: 指定用戶任務之間的等待時間
        3. tasks: 指定用戶的任務列表
      • name:
        對接口請求進行分組,接口參數可能是動態的,在用戶統計信息中將這些 URL 組合在一起才有意義。

      • 鉤子函數:

        1. on_test_start: 測試開始時執行的函數
        2. on_test_stop: 測試結束時執行的函數
      from locust import HttpUser, task, between, LoadTestShape, SequentialTaskSet, constant_throughput, events
      
      
      @events.test_start.add_listener
      def on_test_start(environment, **kwargs):
          """
          測試開始時執行的函數,
          """
          print("測試開始")
      
      
      class UserBehavior(SequentialTaskSet):
          """用戶行為"""
          token = None
      
          def on_start(self):
              """每個用戶啟動時執行的函數"""
              print("用戶啟動")
      
          @task
          def login(self):
              """登錄"""
              with self.client.post("/login", name="登錄", catch_response=True) as response:
                  if response.status_code == 200:
                      self.token = response.json().get("token")
                      response.success()
                  else:
                      response.failure("status_code非200:" + response.text)
      
          @task(3)
          def create_product(self):
              """創建商品"""
              if not self.token:
                  return  # 如果沒有token,不執行創建商品任務
      
              body = {
                  "productName": "測試商品",
              }
              headers = {
                  "Authorization": f"Bearer {self.token}"
              }
              with self.client.post(url="/create_product", name="創建商品", json=body,headers=headers,
                                    catch_response=True) as response:
                  if response.status_code == 200:
                      response.success()
                  else:
                      response.failure("status_code非200:" + response.text)
      
          @task
          def logout(self):
              """退出登錄"""
              if not self.token:
                  return  # 如果沒有token,不執行退出登錄任務
              with self.client.post("/logout", name="退出登錄", catch_response=True) as response:
                  if response.status_code == 200:
                      self.token = None  # 登出后清空token
                      response.success()
                  else:
                      response.failure("status_code非200:" + response.text)
      
      
      class TimeLimitLoadShape(LoadTestShape):
          """10分鐘后自動退出的負載形狀"""
      
          def tick(self):
              # 獲取當前壓測運行時間(秒)
              run_time = self.get_run_time()
              # 10分鐘 = 600秒,超過則退出
              if run_time > 600:
                  return None  # 返回None表示終止測試
              # 壓測期間保持100用戶(可根據需求調整用戶數和增長策略)
              return (100, 10)  # (目標用戶數, 每秒啟動用戶數)
      
      
      class LiveAuctionUser(HttpUser):
          tasks = [UserBehavior]
          wait_time = constant_throughput(2)  # 每個用戶每秒最多執行2次循環
      

      image

      負載壓測實踐

      class StepLoadShape(LoadTestShape):
          """
          階梯壓測形狀:
          - 每 step_duration 秒增加 step_users 個用戶
          - 直到達到 max_users 為止
          """
          step_time = 10  # 每個階梯持續時間(秒)
          step_users = 10  # 每個階梯增加的用戶數
          spawn_rate = 10  # 每秒啟動的用戶數
          max_users = 100  # 最大用戶數
      
          def tick(self):
              # 計算當前所處的階梯數
              run_time = self.get_run_time()
              current_step = int(run_time / self.step_time) + 1
      
              # 計算當前應有的用戶數
              users = current_step * self.step_users
      
              # 檢查是否達到最大用戶數
              if users > self.max_users:
                  return None  # 停止壓測
      
              return (users, self.spawn_rate)
      

      image

      class StagedLoadShape(LoadTestShape):
          """
          分階段階梯壓測:
          1. 預熱階段
          2. 穩定階段
          3. 加壓階段
          4. 收尾階段
          """
          stages = [
              {"duration": 10, "users": 50, "spawn_rate": 10},  # 預熱階段
              {"duration": 20, "users": 50, "spawn_rate": 10},  # 穩定階段
              {"duration": 30, "users": 100, "spawn_rate": 10},  # 加壓階段1
              {"duration": 40, "users": 150, "spawn_rate": 10},  # 加壓階段2
              {"duration": 45, "users": 100, "spawn_rate": 20},  # 減壓階段1
              {"duration": 50, "users": 50, "spawn_rate": 20},  # 減壓階段2
              {"duration": 55, "users": 0, "spawn_rate": 20},  # 減壓階段3
          ]
      
          def tick(self):
              run_time = self.get_run_time()
      
              # 查找當前所處的階段
              for stage in self.stages:
                  if run_time < stage["duration"]:
                      tick_data = (stage["users"], stage["spawn_rate"])
                      return tick_data
      
              # 所有階段完成后停止
              return None
      

      image

      高階使用

      1. 分布式測試
      2. 數據參數化
      3. TaskSet嵌套
      posted @ 2025-07-29 11:21  揚帆去遠航  閱讀(40)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无套内谢少妇一二三四| 国内精品大秀视频日韩精品| 18禁亚洲一区二区三区| 久热久热中文字幕综合激情| 青青草成人免费自拍视频| 最新精品国偷自产在线| 无码人妻久久久一区二区三区| 不卡乱辈伦在线看中文字幕| 欧美 亚洲 国产 制服 中文| 日韩精品一区二区三区四| 任我爽精品视频在线播放| 毕节市| 粉嫩国产av一区二区三区| 国产AV国片精品有毛| 国产精品视频全国免费观看| 东京热人妻无码人av| 亚洲国产精品久久久天堂麻豆宅男| 国产成人免费ā片在线观看| 国产精品久久久久影院亚瑟| 国产一区二区不卡在线| 日韩伦理片| 国内精品伊人久久久久av| 西西人体大胆444WWW| 蜜臀av久久国产午夜| 高清国产一区二区无遮挡| 国产福利深夜在线播放| 无套内射极品少妇chinese| 国语对白刺激在线视频国产网红 | 最新永久免费AV无码网站| 亚洲天堂男人的天堂在线| 日韩精品一区二区三区中文无码| 欧美另类精品xxxx人妖| 免费看黄片一区二区三区| 日本精品中文字幕在线不卡| 成人3d动漫一区二区三区| 精品久久精品久久精品九九| 国产人妇三级视频在线观看| 国产成人精品久久一区二区| 日本一区二区三区免费播放视频站| 林西县| 性色av无码不卡中文字幕|