性能测试工具:locust

1、安装:    

  终端输入:pip install locust 安装,安装后locust --version查看当前Locust版本

  终端输入: locust --help  显示帮助信息

  locust官网: https://www.locust.io/

  官网帮助文档: https://docs.locust.io/en/latest/installation.html

  大并发量测试时,建议在linux系统下进行;

  如果在Windows下遇到问题:locust不是内部或者外部命令,也不是可运行的程序或者批处理文件, 将你安装包的路径的加入用户和系统变量,

  我的位置是C:\Users\86180\AppData\Roaming\Python\Python37\Scripts, 加入环境变量

2、python编写性能测试脚本

  locust通过client属性来使用Python requests库的所有方法,

  调用方式与reqeusts一样(源码中变量client赋值了HttpSession类,而HttpSession继承自requests.Session,故client可以使用requests库中的所有方法,感兴趣的可以看下源码)。

  

# coding=utf-8
import os
from locust import HttpUser, TaskSet, task


class WebsiteTasks(TaskSet):

    """
    测试任务类
    """
    @task(1)
    def TestIndex(self):
        self.client.get("/")

    # @task(2)
    # def LongHuBangAllXiWei(self):
    #     self.client.get("/GongShiApi/50000/LongHuBangAllXiWei")


class WebsiteUser(HttpUser):
    """
    模拟用户类
    """
    tasks = [WebsiteTasks]
    min_wait = 5000
    max_wait = 15000


if __name__ == "__main__":

    """
    # 终端运行:locust -f locustfile.py --host=http://localhost:82
    # 运行界面结果地址:http://localhost:8089
    """

    from pathlib import Path

    os.system("locust -f {} --host=http://localhost:82".format(Path(__file__).name))
  • 使用@task装饰的方法为一个事务,方法的参数用于指定该行为的执行权重,参数越大每次被用户执行的概率越高,默认为1(事务blogs()被执行的概率是bky_index()的2倍);
  • on_start():每个locust用户执行测试事务之前执行一次,用于做初始化的工作,如登录;

  WebsiteUser类用于设置性能测试属性:

  • host :要加载主机的URL前缀(即“https://www.cnblogs.com”),通常是在命令行启动locust时使用--host选项指定,若命令行启动时未指定,该属性被使用;
  • task_set:指向定义的一个用户行为类;
  • min_wait:模拟用户在执行每个任务之间等待的最小时间,单位为毫秒;
  • max_wait:模拟用户在执行每个任务之间等待的最大时间,单位为毫秒(min_wait和max_wait默认值为1000,因此,如果没有声明min_wait和max_wait,则locust将在每个任务之间始终等待1秒。);
  • weight:一个文件中有多个locust用户类时,指定用户类的权重(默认新增locust用户时会随机选择一个用户类);
复制代码
class WebUserLocust(Locust):
    weight = 3
    ...

class MobileUserLocust(Locust):
    weight = 1
    ...
复制代码

  实例中只用了get方式请求,post方式请求操刀实例如下:

复制代码
class JingClue(TaskSet):

    def on_start(self):
        self.login()
        self.header = {
            "Authorization": self.token
        }

    def login(self):
        username = 'xxxxxx'
        password = '123456'
        with self.client.post('/security/log/login', {'username': username, "password": password}) as response:
            if response.status_code == 200:
                self.token = "Bearer " + response.json()["data"]["token"]
  
    @task
    def publicoceanclues(self):
        url = '/xxx/yyy/zzz'
        data = {
            "pageSize": 20,
            "pageIndex": 1,
            "sortField": "discardTime",
            "sortType": -1
        }
        self.client.post(url, json=data, headers=self.header)
复制代码

3、启动:

 locust -f locustfile.py --host=http://127.0.0.1:8001
  • -f       :指定要运行的测试脚本文件;
  • -host :要加载主机的URL前缀,不指定时,读取WebsiteUser类中定义的host;
  • --master:单台机器不能模拟更多用户时,分布式模式,通过--master指定主进程;

4、打开Locust的web界面

  使用上面的命令行启动Locust之后,应该打开浏览器并将其指向http://127.0.0.1:8089(如果您在本地运行Locust)。

 

 

 

  • Number of users to simulate :设置模拟用户数;
  • Hatch rate(users spawned/second) :每秒产生(启动)的虚拟用户数;
  • Start Swarming 开始蜂拥而入

  设置好模拟用户后,点击Start swarming开始测试,测试结果如下:

  • Type   :请求的类型,如GET/POST;
  • Name      :请求的路径;
  • request    :已发出请求数量;
  • fails          :请求失败的数量;
  • Median    :响应时间的中间值(单位:毫秒);
  • Average  :平均响应时间(单位:毫秒);
  • Min         :请求的最小响应时间(单位:毫秒);
  • Max        :请求的最大响应时间(单位:毫秒);
  • Content Size:单个请求的大小(单位:字节);
  • reqs/sec:每秒钟请求的个数;

5. 详细案例

from locust import TaskSet,HttpLocust,between,task
 
def login(x):
    url = '/api/private/v1/login'
    body = {
        "username": "admin",
        "password": "123456"
    }
    r = x.client.post(url=url, data=body)
    print(r.text)
 
def logout(x):
    print("退出系统")
 
def home(x):
    print("进入主页")
 
 
def systeminfo(x):
    print("进入系统管理")
 
class TestLogin(TaskSet):
 
    tasks = {home: 1,systeminfo: 1}
    # @task
    def setup(self):
        print("开始...")
 
    def teardown(self):
        print("结束...")
 
    def on_start(self):
        print("启动")
        login(self)
    # @task
    def on_stop(self):
        print("停止")
        logout(self)
 
 
class WebSiteUser(HttpLocust):
    def setup(self):
        print('locust setup')
    def teardown(self):
        print('locust teardown')
    task_set = TestLogin
    wait_time = between(1,2)
 
if __name__ == '__main__':
    import os
    os.system('locust -f locustfile.py --host=http://192.168.1.105:8899 --port=8089 ')

  

说明:

  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

 

 

posted @ 2020-10-13 14:08  Adamanter  阅读(525)  评论(0)    收藏  举报