zoukankan      html  css  js  c++  java
  • Python 编写locust性能测试代码

    前言

    在Locust测试脚本中,所有业务测试场景都是在HttpLocust和TaskSet两个类的继承子类中进行描述;

    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

    通过命令行启动

    locust -f .load_test.py --host=https://www.baidu.com
    • f 指定性能测试脚本文件。
    • --host 指定被测试应用的URL的地址,注意访问百度使用的HTTPS协议。

    然后通过浏览器访问,并设置测试参数:http://localhost:8089(Locust启动网络监控器,默认为端口号为: 8089)

    TaskSet类

    一个TaskSet类定义了一个用户操作行为的任务集合,测试任务开始后,任务可以顺序执行(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等待。

    这样就可以模拟用户的业务测试场景,对虚拟用户的所有行为进行组织和描述,并可以对不同任务的权重进行配置,一个TaskSet类重要的属性有哪些?

    wait_time属性
    用户wait_time方法是一种可选功能,用于使模拟用户在任务执行之间等待指定的时间。
    内置了三个等待时间功能:

    • constant 在固定的时间内;
    • between 在最大值和最小值之间的随机时间;
    • constant_pacing 自适应时间,以确保任务每X秒(最多)运行一次。

    例如,使每个用户在每次任务执行之间等待0.5到10秒:

    from locust import TaskSet, task, between
    
    class MyUser(TaskSet):
        @task
        def my_task(TaskSet):
            print("executing my_task")
    
        wait_time = between(0.5, 10)

    也可以在类上直接声明自己的wait_time方法。例如,下面的TaskSet类将休眠一秒钟,然后休眠两秒,然后休眠三秒,依此类推。

    class MyUser(TaskSet):
        last_wait_time = 0
    
        def wait_time(self):
            self.last_wait_time += 1
            return self.last_wait_time
    
        ...

    用户任务属性

    有两种方式定义任务(用户行为)
    @task装饰器
    使用task装饰器为用户添加任务
    且@task采用可选的weight参数,该参数可用于指定任务的执行率。在以下示例中,task2被选择为task1的机会是两倍:

    from locust import TaskSet, task
    
    class UserBehavior(TaskSet):
        @task(1)
        def test_job1(self):
            self.client.get('/test1')
    
        @task(3)
        def test_job2(self):
            self.client.get('/test2')

    采用task属性

    from locust import TaskSet
    
    def test_job1(obj):
        obj.client.get('/test1')
    
    def test_job2(obj):
        obj.client.get('/test2')
    
    class UserBehavior(TaskSet):
        tasks = {test_job1: 1, test_job2: 2}
        # tasks = [(test_job1,1), (test_job1,3)] # 两种方式等价

    上面两种定义任务信息方式中,均设置了权重属性,即执行test_job2的频率是test_job1的两倍。若不指定,默认比例为1:1。

    不同用户权重属性
    如果测试文件中存在多个用户类,也就是有多个用户在操作,可以让一个用户有更多操作的机会,比如以这里为例来说,网络用户的可能性是移动用户的三倍:

    class WebUser(TaskSet):
    weight = 3
    ...
    
    class MobileUser(TaskSet):
    weight = 1
    ...

    任务标签

    通过使用@tag装饰器标记任务,您可以对使用在命令行中使用--tagsand--exclude-tags参数指定任务执行,而其他任务跳过考虑以下示例:

    from locust import TaskSet, constant, task, tag
    
    class MyUser(TaskSet):
        wait_time = constant(1)
    
        @tag('tag1')
        @task
        def task1(self):
            pass
    
        @tag('tag1', 'tag2')
        @task
        def task2(self):
            pass
    
        @tag('tag3')
        @task
        def task3(self):
            pass
    
        @task
        def task4(self):
            pass

    如果--tags tag1,那么只有task1任务和task2执行;

    如果--tags tag2 tag3,那么只有task2任务和task3执行。

    注意:可以为一个任务打上多个tag。

    编写接口压测脚本文件locustfile.py

    from locust import HttpLocust, TaskSet, task
    
    class UserBehavior(TaskSet):
        def setup(self):
            print('task setup')
    
        def teardown(self):
            print('task teardown')
    
        def on_start(self):
            # 虚拟用户启动Task时运行
            print('start')
    
        def on_stop(self):
            # 虚拟用户结束Task时运行
            print('end')
    
        @task(2)
        def index(self):
            self.client.get("/")
    
        @task(1)
        def profile(self):
            self.client.get("/profile")
    
    class WebsiteUser(HttpLocust):
        def setup(self):
            print('locust setup')
    
        def teardown(self):
            print('locust teardown')
    
        host = http: // XXXXX.com
        task_set = UserBehavior
        min_wait = 5000
        max_wait = 9000
    
    if __name__ == '__main__':
        pass

    说明:

    Locust类有setup和teardown,TaskSet类有setup、teardown、on_start、on_stop。

    每次启动locust时运行setup方法,退出时运行teardown方法,locust执行TaskSet时运行TaskSet的setup方法,退出时运行teardown方法,每个虚拟用户执行操作时运行on_start方法,退出时执行on_stop方法,运行上面的脚本,执行顺序如下:

    执行顺序:Locust setup → TaskSet setup → TaskSet on_start → TaskSet tasks → TaskSet on_stop → TaskSet teardown → Locust teardown

    创建ScriptTasks()类继承TaskSet类: 用户行为类,用于定义测试业务场景。
    创建index()、about()、demo()方法分别表示一个行为,访问http://example.com。用@task() 装饰该方法为一个任务。1、2表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在当前ScriptTasks()行为下的三个方法得执行比例为2:1:1
    WebsiteUser()类: 用于定义模拟用户。
    task_set : 指向一个定义了的用户行为类。
    host: 指定被测试应用的URL的地址
    min_wait : 用户执行任务之间等待时间的下界,单位:毫秒。
    max_wait : 用户执行任务之间等待时间的上界,单位:毫秒。

    参考:

    https://docs.locust.io/en/stable/writing-a-locustfile.html

    https://www.cnblogs.com/monogem/p/10715637.html

  • 相关阅读:
    php数组
    php 函数
    数据库操作
    PHP基础
    mysql常用函数
    10.25 (下午) 开课一个月零二十一天(抽象)
    10.25 (上午) 开课一个月零二十一天 (继承多态)
    10.24 (下午) 开课一个月零二十天 (封装)
    10.24 (上午) 开课一个月零二十天 (面向对象)
    10.23 开课一个月零十九天 (PHP数组)
  • 原文地址:https://www.cnblogs.com/-wenli/p/14199716.html
Copyright © 2011-2022 走看看