locust入门2

2022-04-12 14:36:49 浏览数 (1)

先说明一下执行的方法

  1. 每次写完代码都要在Pycharm的Terminal/终端中执行命令:locust -f 文件名.py --host=https://api.weixin.qq.com 如果你有测试地址,可以换成你的地址,现在只是演示用法,所以写了地址也没有做请求。
  2. 终端执行以后

点击上面链接或刷新网站这个地址页面都可以

然后点击Start swarming,我们这里了解代码写法,所以用户数和每秒增加用户数都不用管。

如果要中断执行,可以在终端中通过Control c中断,也可以再页面点击Stop停止

前后置

有时候我们做压测前需要先登录,然后才能执行测试

locust提供了on_starton_stop方法,类似selenium中的setUpClasstearDownClass,这两个方法只有在测试开始和测试结束/中断时执行一次。

代码语言:javascript复制

from locust import HttpUser, task, between, events


class QuickstartUser(HttpUser):
  
    wait_time = between(1, 2)

    def on_start(self):
        print("每个用例前执行一次")

    @task
    def get_access_token(self):
        print("标记为task(3)的用例")

    def on_stop(self):
        print("停止测试时执行")

在终端执行命令locust -f testindex.py --host=https://api.weixin.qq.com

执行结果:

wait_time:设定每个任务执行中间的间隔时间,between(min, max)表示在最小值和最大值中间随机取;constant表示间隔固定时间。

@task任务装饰器

@task装饰器:定义任务的方式。比如on_starton_stop我们只是做一些前后操作准备,而通过@task装饰的方法才是我们真正要执行的测试用例。@task可以通过数字标记权重,比如

代码语言:javascript复制

from locust import HttpUser, task, constant


class QuickstartUser(HttpUser):

    wait_time = constant(1)

    @task(2)
    def create_tags(self):
        print('标记为task(2)的用例')

    @task(1)
    def get_access_token(self):
        print("标记为task(1)的用例")

    @task(3)
    def my_test(self):
        print("标记为task(3)的用例")

在终端执行命令:locust -f createFlag.py --host=https://api.weixin.qq.com

注意:任务权重,代表任务执行的概率,数字越大,被执行到的可能性就越大,可以看到,因为task(3)方法权重最高,所以他被执行到的次数最多,我执行了5秒,得到的输出除了个别task(2),都是task(3),而task(1)根本没有被执行到,这与用例执行间隔时长无关。也就是说你不能利用权重来给用例排执行的顺序,因为权重高的可能执行了100次,而权重低的一次都没有执行。执行的顺序目前来看只能你通过代码执行顺序进行定义。

也可以通过列表或者字典来标记task,例如:

代码语言:javascript复制

from locust import constant, User


def create_tags(self):
    print('标记为task(2)的用例')


def get_access_token(self):
    print("标记为task(1)的用例")


def my_test(self):
    print("标记为task(3)的用例")


class MyUser(User):
    tasks = [create_tags, get_access_token, my_test]
    wait_time = constant(1)

这里没有加权重,执行结果就是随机的

如果需要权重信息,可以利用字典:

代码语言:javascript复制

from locust import constant, User


def create_tags(self):
    print('标记为task(2)的用例')


def get_access_token(self):
    print("标记为task(1)的用例")


def my_test(self):
    print("标记为task(3)的用例")


class MyUser(User):
    tasks = tasks = {create_tags: 1, get_access_token: 4, my_test: 3}
    wait_time = constant(1)

@tag标签装饰器

可以利用@tag(tag_name)给用例打标签,方便执行的时候只执行标签用例,或者排除某些用例

代码语言:javascript复制
# coding: utf-8

from locust import constant, User, tag

@tag(3)
def create_tags(self):
    print('标记为task(2)的用例')


@tag('tag1')
def get_access_token(self):
    print("标记为task(1)的用例")


@tag('tag1', 'tag2')
def my_test(self):
    print("标记为task(3)的用例")


class MyUser(User):
    tasks = {create_tags: 1, get_access_token: 4, my_test: 3}
    wait_time = constant(1)

如果只想执行tag2、tag3标签用例,则:

locust -f createFlag.py --tags tag2 tag3 --host=https://api.weixin.qq.com

注意,执行多个标签用例时,执行哪个、分别执行多少次,都是随机的。即使是我们刚才说的权重,也只能说权重高的比权重低的被执行的概率高。

如果只是不执行tag2标签用例,则:

locust -f createFlag.py --exclude-tags tag2 --host=https://api.weixin.qq.com

Events

  • test_start和test_stop

当定义了类时,通过on_starton_stop可以实现对任务开始和结束操作的定义。但是如果没有定义类,这两个方法就不起作用了,这时候就可以通过事件test_starttest_stop进行监听

代码语言:javascript复制
# coding: utf-8

from locust import constant, User, tag, events


@events.test_start.add_listener
def on_test_start(environment, **kwargs):
    print("A new test is starting")


@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
    print("A new test is ending")


@tag('tag3')
def create_tags(self):
    print('标记为task(2)的用例')


@tag('tag1')
def get_access_token(self):
    print("标记为task(1)的用例")


@tag('tag1', 'tag2')
def my_test(self):
    print("标记为task(3)的用例")


class MyUser(User):
    tasks = [create_tags, get_access_token, my_test]
    wait_time = constant(1)

执行locust -f createFlag.py --host=https://api.weixin.qq.com

  • init

初始化监听,一般用于多并发模式。类似Jmeter多并发,除了Master主机还有很多Slave从机,当你需要声明一个全局变量时,就可以利用init事件监听

代码语言:javascript复制
from locust import events
from locust.runners import MasterRunner

@events.init.add_listener
def on_locust_init(environment, **kwargs):
    if isinstance(environment.runner, MasterRunner):
        print("I'm on master node")
    else:
        print("I'm on a worker or standalone node")

这个代码是官网给的案例,我们还没有到多并发那一步,暂时不做分析。

0 人点赞