`性能测试框架locust从入门到精通
什么是Locust
什么是Locust?
Locust是易于使用,可编写脚本且可扩展的性能测试工具。您可以使用常规Python代码定义用户的行为,而不是使用笨拙的UI或特定于域的语言。这使Locust可以无限扩展,并且对开发人员非常友好。要开始使用Locust,请先安装。
用普通的Python编写用户测试方案
如果要让用户循环,执行某些条件行为或进行一些计算,则只需使用Python提供的常规编程结构即可。Locust在其自己的greenlet(轻量级进程/协程)中运行每个用户。这使您可以像编写普通(阻塞)Python代码一样编写测试,而不必使用回调或其他某种机制。因为您的场景是“only python”,所以您可以使用常规的IDE,并将测试版本控制为常规代码(与其他一些使用XML或二进制格式的工具相对)
分布式和可扩展-支持数十万用户
Locust使运行分布在多台计算机上的负载测试变得容易。它是基于事件的(使用gevent),这使得单个进程可以处理成千上万的并发用户。尽管可能还有其他工具可以在给定的硬件上每秒执行更多请求,但是每个Locust用户的低开销使其非常适合测试高并发工作负载。
基于Web的UI
Locust具有用户友好的Web界面,可实时显示测试进度。您甚至可以在测试运行时更改负载。它也可以在没有UI的情况下运行,从而易于进行CI / CD测试。
可以测试任何系统
即使Locust主要与网站/服务一起使用,它也可以用于测试几乎任何系统或协议。只需 为您要测试的内容编写一个客户端,或者浏览社区创建的内容。
Locust很小,非常灵活,我们打算保持这种状态。如果您想将报告数据发送到您喜欢的数据库和图形系统,包装对REST API的调用以处理系统的细节或运行完全自定义的加载模式,那么没有什么可以阻止您!
背景
Locust出于对现有解决方案的不满而诞生。没有一个现有的负载测试工具能够很好地针对动态网站生成实际负载,在动态网站上,大多数页面针对不同用户具有不同的内容。现有工具使用笨拙的界面或冗长的配置文件来声明测试。在locust中,我们采取了不同的方法。代替配置格式或UI,您将获得一个python框架,该框架可让您使用Python代码定义用户的行为。
作者
乔纳坦·海曼(@jonatanheyman onTwitter)
拉斯·霍尔姆伯格(@cyberw on Github)
卡尔·拜斯特罗姆(Twitter @cgbystrom)
JoakimHamrén(@Jahaaja oTwitter)
雨果·海曼(@hugoheyman on Twitter)
安装
安装
安装Python 3.6或更高版本。
使用pip安装Locust。
$ pip3 install locust
验证安装并显示Locust版本号:
$ locust -V
如果一切正常,请继续快速入门。如果没有,请查看Wiki以获取一些解决方案。
快速开始
快速入门
在普通的python文件中编写Locust性能测试:
import time
from locust import HttpUser, task
class QuickstartUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
def on_start(self):
self.client.post("/login", json={
"username":"foo", "password":"bar"})
让我们分解一下
import time
from locust import HttpUser, task
Locust文件是普通的Python模块,它可以从其他文件或包中导入代码。
class QuickstartUser(HttpUser):
模拟用户的行为由Locust文件中的类表示。当您开始测试运行时,Locust将为每个并发用户创建该类的实例。
@task
def hello_world(self):
...
装饰器方法@task是蝗虫文件的核心。Locust为每个正在运行的用户创建一个greenlet(微线程),该greenlet将调用这些方法。
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
self.client属性使进行由Locust记录的HTTP调用成为可能。有关如何发出其他类型的请求,验证响应等的信息,请参阅《使用HTTP API》。
@task(3)
def