其他分享
首页 > 其他分享> > 使用Locust进行性能测试

使用Locust进行性能测试

作者:互联网




from locust import HttpLocust, TaskSet

def login(l):
    l.client.post("/login", {"username":"test_one", "password":"education"})

def index(l):
    l.client.get("/")

def profile(l):
    l.client.get("/profile")

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1} #请求比例是index:profile = 2:1

    def on_start(self):
        login(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000 #最小间隔5s
    max_wait = 9000 #最大间隔9s

在这里定义了一些Locust任务(即def login(l),def profile(l),def index(l)),这些任务是正常的Python方法,它们只接受一个参数(Locust类实例)。这些任务在任务属性中的TaskSet类下收集。然后定义一个表示用户的WebsiteUser类,在WebsiteUser类定义模拟用户在执行任务之间应该等待多长时间,以及TaskSet类应该定义用户的“行为”。TaskSet类可以嵌套。
HttpLocust类继承自Locust类,它添加了一个客户端属性(HttpSession的实例),可用于发出HTTP请求。

另一种更方便的定义方式,使用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 login(self):
        self.client.post("/login", {"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的基本概念,主要功能和一个示例,现在主要进阶的功能.

Locust类


一个locustfile至少包含一个继承了Locust的类.Locust会为被模拟的每个用户生成locust的实例,这些属性是应该被实现的:

TaskSet类


每个Locust类必须有一个task_set属性,task_set指向一个TaskSet类。TaskSet相当于Locust的大脑.
任务设置任务的典型方法是使用任务修饰器:

from locust import Locust, TaskSet, task

class MyTaskSet(TaskSet):
    @task
    def my_task(self):
        print("Locust instance (%r) executing my_task" % (self.locust))

class MyLocust(Locust):
    task_set = MyTaskSet

taskset的一个非常重要的特性是它们可以被嵌套,因为真正的网站通常是以分层的方式构建的,有多个子节。嵌套taskset将允许我们定义一个行为,以更现实的方式模拟用户。例如,可以用以下结构定义taskset:

class ForumPage(TaskSet):
  @task(20)
  def read_thread(self):
      pass

  @task(1)
  def new_thread(self):
      pass

  @task(5)
  def stop(self):
      self.interrupt()

class UserBehaviour(TaskSet):
  tasks = {ForumPage:10}

  @task
  def index(self):
      pass

在上面的例子中,如果ForumPage在执行UserBehaviour任务集时被选择执行,那么ForumPage任务集就会开始执行。ForumPage任务集将选择它自己的任务之一执行它.

有一个重要的事情需要注意,那就是在ForumPage的stop方法中调用self.interrupt()。这实际上是停止执行ForumPage任务集,但UserBehaviour实例将会继续运行。如果没有调用ForumPage的中断()方法,那么Locust一旦启动就不会停止运行该ForumPage任务。通过使用中断函数,我们可以结合任务权重定义一个模拟用户离开测试网站的可能。

还可以使用@ task decorator声明嵌套的TaskSet,就像声明普通任务时一样:

class MyTaskSet(TaskSet):
  @task
  class SubTaskSet(TaskSet):
      @task
      def my_task(self):
          pass

分布式运行Locust


如果单主机满足不了并发要求,可以使用多台机器上运行负载测试。

可以使用--master以主模式启动Locust的一个实例。这个实例将运行Locust的web界面,可以在这个web界面开始测试并查看实时统计信息。主节点自身不发送请求。因此,必须启动一个或多个从属节点,使用--slave标记,以及--master-host指定主节点的IP /主机名。

举例:
主模式:locust -f my_locustfile.py --master
从模式:locust -f my_locustfile.py --slave --master-host=192.168.0.14(192.168.0.14是运行主模式的机器ip)

在命令行直接执行,不使用Web UI界面


如果想要在没有web UI的情况下运行locust(例如,想在一些自动化流程中运行它,比如CI服务器), 使用--no-web标志和-c-r参数.
locust -f my_locust_file.py --no-web -c 1000 -r 100

-c指定并发用户总数,-r指定用户生成速率

-t或者--run-time可以指定程序的运行时间.
locust -f --no-web -c 1000 -r 100 --run-time 1h30m

在命令行分布式运行Locust

需要在主节点指定--expect-slaves 参数,以确定需要多少从节点连接.直到达到这个数量的从节点连接上主节点,才会启动测试.

以csv格式保存测试结果

  1. 如果是用Web UI方式启动Locust,则可以在Download Data Tab页面下载csv格式的测试结果
  2. 如果是用命令行方式启动Locust,则可以指定-csv参数,它将定期保存CSV文件.如果打算以自动化的方式在命令行运行Locust,这点特性将特别有用。
    locust -f my_locust_file.py --csv=foobar --no-web -n10 -t10m
    可以这样自定义csv文件定期保存的间隔时间(默认是2s):
    import locust.stats
    locust.stats.CSV_STATS_INTERVAL_SEC = 5 # default is 2seconds
    

标签:task,TaskSet,--,Locust,性能,locust,测试,self
来源: https://blog.csdn.net/MidSummer411/article/details/117423045