性能常识 Locust 从入门到实战

欲野法师 · 2020年12月01日 · 最后由 少年 回复于 2020年12月01日 · 3704 次阅读

学习背景

最近公司的测试任务不是很紧急,测试这边有点闲置,但是作为一个合格的小测试,不应该让自己太安逸了,正所谓,生于忧患,死于安乐,干脆来个带薪学习吧,为自己的饭碗增加一份保险😁,于是把自己的核心技能梳理了一遍,发现自己在性能这块,有点缺乏于是开始充电一波,于是决定入手 Locust 的的学习。

性能基础知识

都知道 locust 是做性能测试的工具,那么学习 locust 之前,一些基础性能知识还是得知道的,个人粗略的说下。

性能分层

现在互联网很常见的一种现象,就是前后端分离相互独立,同理,我们性能也是分层次的,个人主要讲性能分为前后两端主要如下:
前端主要分为两种架构类型的一种 CS 架构的 app,小程序等和 BS 的 web 网页网站,前端性能根据个理解主要范围如下:
App:
卡顿,流畅度,资源消耗,流量消耗,稳定兼容弱网等
Web:
基于浏览器的页面渲染,js 的性能消耗等
后端,也叫服务端,说白了,后端的主要性能,就是是大批量的前端,批量访问服务端,个人理解需要关注的主要点如下:

  • 协议
  • 并发
  • 场景设计模拟等

什么是线程什么是协程

工具选择

说到性能测试工具,大部分的人都会先到 LR ,Jmeter,ad 等工具,但是,由于 LR 虽然好,但是专业版本的需要人民币,而且比较笨重,有人可能会说,那你选择 jmeter 啊,但是我想说,LR 和 jmeter 其实都是基于多线程实现的,举个生活中的小栗子,我们面试都会碰见这样一道题,请描述一个打开一个网站的的过程。其实在性能方面,LR 和 jmetr,在做法上是又区别的,这里以前端最讨厌的浏览器,ie 举例说明,大家在使用 ie 浏览器打开一个网站和使用 LR 或者 jmeter 打开一个网站,有人关注过他们的时间吗,他们三者之间的耗时速度分别如下:
ie 比 jmeter 快,jmeter 比 LR 快,原因是什么呢,因为 ie 在打开一个网站的时候,他的请求次数和使用 lr 或者 jmeter 的请求次数是一致的,lr 录制的时候,是吧是由静态资源的请求都是录制了,jmeter 是只录制了部分的,没有录制完整的请求,即使从 html 文件获取资源也不可能达到。还有就是,lr(本人只玩了一下 11)在打开网站的时候,是比 ie 要慢的,因为,lr 在获取静态资源的时候,只开了两个线程,ie 开了 6 个,所以 ie 比较快,但是其实相差不大,很多人可能觉得我 i 会选择 jmeter 了,但是个人发现,凡是 apache 下面的东西都比较消耗 cpu 资源,现在加上 jmeter 本来就会,我干脆换个工具学习吧,于是自己百度了一波,最终选择 Locust,理由,开源,现在加上 locust 是基于协程并发的,对 cpu 消耗较小,还有一点,本人 java 不会,python 还会一点,即使以后二次改造,方便点,最后决定是由 Locust。

Locust 简介

Locust 官网
Locust 官方文档
Locustgithub 源码位置

什么是 locust

Locust 是一款易于使用的分布式负载测试工具,完全基于事件,即一个 locust 节点也可以在一个进程中支持数千并发用户,不使用回调,通过 gevent 使用轻量级过程(即在自己的进程内运行)

Locust 优点

  1. 不需要编写笨重的 UI 或者臃肿的 XML 代码,基于协程而不是回调,脚本编写简单易读
  2. 有一个基于 we 简洁的 HTML+JS 的 UI 用户界面,可以实时显示相关的测试结果
  3. 支持分布式测试,用户界面基于网络,因此具有跨平台且易于扩展的特点
  4. 所有繁琐的 I/O 和协同程序都被委托给 gevent,替代其他工具的局限性
  5. 开源免费,支持高并发,方便二次改造,打造性能自动化测试平台

Locust 和 Jmeter 的区别

由于自己之前会 jmeter,个人还是希望比较一下他们的区别

Locust 环境部署

直接 pip 安装即可

pip install Locust

检验是否安装成功

1.是由 pip list 可查看即可

Locust 实战

上面说了这么多,不能光说不练,接下来我们就通过一个简单的小例子完成 Locust 的实战。废话不多说,直接上代码。。。。

# -*- coding: utf-8 -*-
# @Pjname ;ApiDome
# @Time   :2020/11/30/22:19
# @Author :Yuye
# @File   :LocustDome.py

from locust import HttpUser, task, TaskSet, events
import time, sys,


class UserBehavior(HttpUser):

    def on_start(self):
        print("运行压测前置条件")

    def get_response(self, response):
        """
        获取返回
        :param response:请求返回对象
        :return:
        """
        start_time = int(time.time())
        if response.status_code == 200:
            events.request_success.fire(
                request_type="recv",
                name=sys._getframe().f_code.co_name,
                response_time=int(time.time() - start_time) * 1000,
                response_length=0
            )
        else:
            events.request_failure.fire(
                request_type="recv",
                name=sys._getframe().f_code.co_name,
                response_time=int(time.time() - start_time) * 1000,
                response_length=0,
                exception=f"Response Code Error! Code:{response.content}"
            )

    @task(1)
    def test_get(self):
        self.client.get("http://www.baidu.com", name="打开百度首页")

    @task(1)
    def test_post(self):
        """由于没有免费的post接口暂时使用百度搜索"""
        self.client.get("http://www.baidu.com?wd=testerhome", name="使用百度搜索")


class WebUser(TaskSet):
    """性能测试配置 换算配置"""
    host = "http://www.baidu.com"
    task_set = UserBehavior  # Testcase类
    min_wait = 1000
    max_wait = 3000

上述代码的主要逻辑实现如下

新建一个类 WebUser(TaskSet),继承 TaskSet,该类下面写需要请求的接口以及相关信息;self.client 调用 get 和 post 方法,和 requests 一样;@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是 1;WebsiteUser() 类用于设置生成负载的基本属性:

如何运行 locust

1、如果启动的 locust 文件名为 LocustDome.py 并位于当前工作目录中,可以在编译器中直接运行该文件,或者通过 cmd,执行如下命令:

locust --host=http://www.baidu.com

2、如果 Locust 文件位于子目录下且名称不是 LocustDome.py,可以使用-f 命令启动上面的示例 locust 文件:

locust -f LocustDome.py --host=http://www.baidu.com

3、如果要运行分布在多个进程中的 Locust,通过指定-master 以下内容来启动主进程 :

locust -f LocustDome.py --master --host=http://www.baidu.com

4、如果要启动任意数量的从属进程,可以通过-salve 命令来启动 locust 文件:

locust -f LocustDome.py  --worker  --host=http://www.baidu.com

5、如果要运行分布式 Locust,必须在启动从机时指定主机(运行分布在单台机器上的 Locust 时不需要这样做,因为主机默认为 127.0.0.1):

locust -f LocustDome.py  --worker --master-host=127.0.0.1 --host=http://www.baidu.com

6、启动 locust 文件成功后,编译器控制台会显示如下信息:

PS:8089 是该服务启动的端口号,如果是本地启动,可以直接在浏览器输入http://127.0.0.1:8089UI 界面,如果是其他机器搭建 locust 服务,则输入该机器的 IP+ 端口即可;打开

启动成功如下

测试报告

共收到 5 条回复 时间 点赞

真要看重性能,可能你得看下 boomer

欲野法师 回复

我不是大佬,大佬这个高帽有点大。。。

大家平等交流就好,技术面前无大佬。

现在 locust 都不怎么更新了,在 python3 的时代,如果只是测 http 请求的话,用 aiohttp 写一下就完事了

陈恒捷 回复

报告大佬,目前刚刚开始学习中,刚刚开始入门

写得挺完整的,点个赞。

期望后面能分享下实际项目中的实战情况,文中的 “实战” 我理解只是跑通一个 demo,和项目实战还是有点差距的。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册