学习笔记-locust入门

1、性能测试定义

  • 在一定的负载情况下,系统的响应时间等待特性是否满足特定的性能需求,较广泛的的概
    念(关注 CPU 的使用率、内存的使用率、磁盘的队列等

2、测试分类

  • 负载测试:模拟不同的用户集,在不同的用户集下,关注性能指标
  • 压力测试:更大的负载,高负载就是压力
  • 容量测试:在一定的软硬件和网络条件下,在数据库中构造不同级别的数据,再一定用户
    情况下执行,获取指标
  • 配置测试:不同的软硬件,运行的多种业务,看哪种配置指标是最优,最后得到最佳搭配
  • 基准测试:运行单个业务得到一个参照值(单个线程)
  • 稳定性测试 :长时间运行,保持合理的负载
  • 并发测试:引入集合点

3、流程

  • 分析——业务理解、需求分析、评估工作
  • 设计——模型、方案、脚本
  • 实现——脚本开发、环境、数据
  • 执行——运行测试、分析调优、测试报告

4、locust优点

  • 分布式执行。配置 master 和 slave(主从机器),在多台机器上对系统持续发起请
    求。(一个主机控制多台 slave 从机)
  • 基于事件驱动,与其他工具使用进程和线程来模拟用户不同,Locust 借助了 gevent
    库对协程的支持,可以达到更高数量的并发(线程是微进程,协程是微进程)

5、locust示例

class WebsiteTasks(TaskSet):
    def on_start(self):
        #进行初始化的工作,每个Locust用户开始做的第一件事
        self.readyaml = ReadYamlTool()
        #添加cookie
        cookie = self.readyaml.get_cookie(ApiData.projectName, 'cookies', 'COOKIESCONF', 'test_sudiyicas')
        jar = self.client.RequeststookieJar()
        jar.set('sudiyi.cas.test', cookie)
        self.client.cookies.update(jar)

    @task(weight=1)  #表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高
    def run_city_rank(self):
        #调用城市排名接口
        jsonTansfer = JsonTransfer(ApiData.prjectName, ApiData.moduleName, ApiData.jsonFileName[0])
        # 获取接口数据
        api_data = jsonTansfer.read_api_data(ApiData.moduleName, ApiData.apiName[0])
        # 获取校验数据
        check_data = jsonTansfer.read_check_data(ApiData.moduleName)
        httpcode = check_data['httpcode']
        code = check_data['code']
        message = check_data['message']
        api_url = api_data['api_url']
        body_data = api_data['body_data']
        headers = authTool.makeHeaders(ApiData.HEADER_TYPE, 'POST', api_url)

        res = self.client.post(url=api_url,data=body_data,headers=headers,catch_response=True)

        re_httpcode = res.status_code
        re_code = res.json()['code']
        re_message =  res.json['message']

        #检查结果
        try:
            if re_httpcode == httpcode and re_code ==code and re_message==message:
                res.success()

            else:
                res.failure('[FailInfo]:{}'.format(str(res.json())))

        except Exception as e:
            res.failure('[ErrorInfo]:{}'.format(e))


class WebsiteUser(HttpLocust):
    task_set = WebsiteTasks
    min_wait = 1000 #用户执行任务之间等待时间的下界,单位:毫秒。
    max_wait = 2000 #用户执行任务之间等待时间的上界,单位:毫秒。 在测试过程中,两次请求的间隔时间为1->2秒间的随机值。
    host = host

5、locust执行流程

  • 1、先执行WebsiteTasks中的on_start(只执行一次),作为初始化;
  • 2、从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就按照权重关系随机挑选)一个任务执行;
  • 3、根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;
  • 4、重复2~3步骤,直到测试任务终止

6、TaskSet类

1、TaskSet类实现了虚拟用户所执行任务的调度算法,包括规划任务执行顺序(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等待。在此基础上,就可以在TaskSet子类中采用非常简洁的方式来描述虚拟用户的业务测试场景,对虚拟用户的所有行为进行组织和描述,并可以对不同任务的权重进行配置。

2、通过@task()装饰的方法为一个事务。方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。
TaskSet子类中定义任务信息时,采取两种方式:@task装饰器和tasks属性。

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')

采用tasks属性定义任务信息时

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:3}
    # tasks = [(test_job1,1), (test_job1,3)] # 两种方式等价
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容