阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Locust 快速入门

      快速入门

      locustfile.py

      下面是一个简单的locustfile.py的小示例

      from locust import HttpLocust, TaskSet
      
      def login(l):
          l.client.post("/login", {"username":"ellen_key", "password":"education"})
      
      def logout(l):
          l.client.post("/logout", {"username":"ellen_key", "password":"education"})
      
      def index(l):
          l.client.get("/")
      
      def profile(l):
          l.client.get("/profile")
      
      class UserBehavior(TaskSet):
          tasks = {index: 2, profile: 1}
      
          def on_start(self):
              login(self)
      
          def on_stop(self):
              logout(self)
      
      class WebsiteUser(HttpLocust):
          task_set = UserBehavior
          min_wait = 5000
          max_wait = 9000
      
      

      在这里,我们定义了许多Locust任务,它们是带有一个参数(Locust类实例)的普通 Python 可调用对象。这些任务收集在 task 属性中的TaskSet类下 。然后,我们有一个代表用户的 类,其中定义了模拟用户在执行任务之间应等待的时间,以及 应该定义用户的“行为”的类。 类可以嵌套。Http``Locust``TaskSetTaskSet

      HttpLocust从类继承 Locust的类,并把它添加一个客户端属性,它是的一个实例 HttpSession,可用于使HTTP请求。

      默认情况下,我们不再寻找代理设置以提高性能。如果您确实希望测试请求通过 HTTP 代理,则可以从HttpLocust该类继承,并将 trust_env 字段设置为 True。有关更多详细信息,请参阅请求文档。

      我们可以声明任务的另一种方法(通常更方便)是使用 @task 装饰器。

      以下代码与上面的代码等效:

      from locust import HttpLocust, TaskSet, task
      
      class UserBehavior(TaskSet):
          def on_start(self):
              """ on_start is called when a Locust start before any task is scheduled """
              self.login()
      
          def on_stop(self):
              """ on_stop is called when the TaskSet is stopping """
              self.logout()
      
          def login(self):
              self.client.post("/login", {"username":"ellen_key", "password":"education"})
      
          def logout(self):
              self.client.post("/logout", {"username":"ellen_key", "password":"education"})
      
          @task(2)
          def index(self):
              self.client.get("/")
      
          @task(1)
          def profile(self):
              self.client.get("/profile")
      
      class WebsiteUser(HttpLocust):
          task_set = UserBehavior
          min_wait = 5000
          max_wait = 9000
      
      

      Locust类(以及HttpLocust 因为它是一个子类),也可以让一个在指定最小和最大等待时间毫秒,每个模拟用户之间的任务执行(min_wait 和 MAX_WAIT)以及其他用户的行为。

      默认情况下,时间是在 min_wait 和 max_wait 之间均匀地随机选择的,但是可以通过将 wait_function 设置为任意函数来使用任何用户定义的时间分布。

      例如,对于平均时间为 1 秒的指数分布等待时间:

      import random
      
      class WebsiteUser(HttpLocust):
          task_set = UserBehaviour
          wait_function = lambda self: random.expovariate(1)*1000
      
      

      启动 Locust

      要使用上述 Locust 文件运行 Locust,如果该文件名为locustfile.py且位于当前工作目录中,则可以运行:

      $ locust --host=http://example.com
      

      如果 Locust 文件位于子目录下和 / 或名称不同于 locustfile.py,请使用-f以下命令指定它:

      $ locust -f locust_files/my_locust_file.py --host=http://example.com
      

      要运行跨多个进程分布的 Locust,我们可以通过指定--master以下内容启动主进程 :

      $ locust -f locust_files/my_locust_file.py --master --host=http://example.com
      
      

      然后我们将启动任意数量的从属进程:

      $ locust -f locust_files/my_locust_file.py --slave --host=http://example.com
      
      

      如果要在多台计算机上运行 Locust 分布式服务器,则在启动从属服务器时也必须指定主服务器主机(在单台计算机上运行 Locust 时不需要,因为主服务器主机默认为 127.0.0.1):

      $ locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 --host=http://example.com
      
      

      注意:要查看所有可用选项,请输入: locust --help

      打开 Locust 的 Web 界面

      使用上述命令行之一启动 Locust 后,应该打开浏览器并输入 http://127.0.0.1:8089(如果在本地运行 Locust)。

      然后,您应该会看到类似以下内容:

      _images/webui-splash-screenshot.png

      另一个性能测试脚本

      创建 load_test.py 文件,通过 Python 编写性能测试脚本。

      from locust import HttpLocust, TaskSet, task
      
      # 定义用户行为
      class UserBehavior(TaskSet):
      
          @task
          def baidu_index(self):
              self.client.get("/")
      
      
      class WebsiteUser(HttpLocust):
          task_set = UserBehavior
          min_wait = 3000
          max_wait = 6000
      

      UserBehavior 类继承 TaskSet 类,用于描述用户行为。

      baidu_index() 方法表示一个用户为行,访问百度首页。使用 @task 装饰该方法为一个事务。client.get() 用于指请求的路径“/”,因为是百度首页,所以指定为根路径。

      WebsiteUser 类用于设置性能测试。

      • task_set :指向一个定义的用户行为类。
      • min_wait :执行事务之间用户等待时间的下界(单位:毫秒)。
      • max_wait :执行事务之间用户等待时间的上界(单位:毫秒)。

      启动性能测试

      > locust -f .\load_test.py --host=https://www.baidu.com
      
      [2017-10-16 16:44:40,839] DESKTOP-SMGQBBM/INFO/locust.main: Starting web monitor at *:8089
      [2017-10-16 16:44:40,842] DESKTOP-SMGQBBM/INFO/locust.main: Starting Locust 0.8
      
      • -f 指定性能测试脚本文件。
      • –host 指定被测试应用的 URL 的地址,注意访问百度使用的 HTTPS 协议。

      通过浏览器访问:http://localhost:8089(Locust 启动网络监控器,默认为端口号为:8089)

      设置测试数据

      locust

      • Number of users to simulate 设置模拟用户数。

      • Hatch rate(users spawned/second) 每秒产生(启动)的虚拟用户数。

      • 点击 “Start swarming” 按钮,开始运行性能测试。

      运行测试

      locust

      性能测试参数

      • Type: 请求的类型,例如 GET/POST。
      • Name:请求的路径。
        • 这里为百度首页,即:https://www.baidu.com/
        • 老铁们测试的时候,千万别用我的站测试啊,阿西河的服务器用的是小水管,垃圾机器,经不起各位大佬的测试; - -!
      • request:当前请求的数量。
      • fails:当前请求失败的数量。
      • Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
      • Average:平均值,单位毫秒,所有请求的平均响应时间。
      • Min:请求的最小服务器响应时间,单位毫秒。
      • Max:请求的最大服务器响应时间,单位毫秒。
      • Content Size:单个请求的大小,单位字节。
      • reqs/sec:是每秒钟请求的个数。
      目录
      目录