完整的Locust测试脚本编写
在上一篇文章中,介绍了运行一个Locust测试脚本的完整过成,包括设置运行场景、运行命令、运行中的数据监控等内容,接下来的本文中将会介绍一个完整的测试脚本如何编写。
首先,看一段完整的测试脚本:
import time
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1. 5)
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(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"})
脚本的内容对于新手来说,可能真的还是有点难度的,不过也没关系,接下来一一的解释一番。
1、导入常用的包
Locust测试脚本也是正常的Python代码,也需要导入各种程序包才能很好的运行,所以,第一步就是导入包:
import time
from locust import HttpUser, task, between
以上的包就是time包、Locust包中的部分模块。
HttpUser模块的作用是模拟用户发送HTTP请求;
Time模块是为了使用休眠等时间控制函数;
Task模块是为了使用Locust框架的任务模块
Between模块是为了设置等待时间的区间的;。
2、定义测试类
这里为将要模拟的用户定义一个类。它从HttpUser继承,HttpUser给每个用户一个client属性,这是HttpSession的一个实例,可以用来向想要加载测试的目标系统发出HTTP请求。当测试开始时,locust将为它模拟的每个用户创建该类的实例,每个用户将开始在自己的绿色gevent线程中运行。
class QuickstartUser(HttpUser):
一个文件要成为一个有效的locustfile,它必须包含至少一个继承自User的类。
3、定义wait_time
它将使模拟用户在每个任务执行后等待1到5秒。
wait_time = between(1. 5)
接下来,用@task装饰的方法是Locust文件的核心。对于每个运行的用户,Locust创建一个greenlet(微线程),该线程将调用这些方法。
4、定义方法
通过用@task装饰两个方法,案例中已经声明了两个任务,其中一个被赋予了更高的权重(3)。当QuickstartUser运行时,它会选择一个已声明的任务——在本例中是hello_world或view_items——并执行它。任务是随机挑选的,但可以给它们不同的权重。
上述配置将使Locust选择view_items的可能性是hello_world的三倍。当一个任务完成执行时,User将在它的等待时间(在本例中是1到5秒)中休眠。在它的等待时间之后,它会选择一个新任务并不断重复。
@task
def hello_world(self):
...
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(self):
...
注意,只有装饰了@task的方法才会被选中,所以可以任意定义自己的内部助手方法。
5、发送请求
self.client.get("/hello")
self.client属性使得发出将被Locust记录的HTTP调用成为可能。案例中使用get方法发送请求。
HttpUser不是一个真正的浏览器,因此不会解析HTML响应来加载资源或呈现页面。但它会跟踪cookie。
@task(3)
def view_items(self):
for item_id in range(10)
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
6、设置多参数运行
在view_items任务中,使用一个可变的查询参数加载10个不同的url。为了不在Locust的统计数据中获得10个单独的条目(因为统计数据是根据URL分组的),使用name参数将所有这些请求分组到一个名为“/item”的条目下。
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
此外,案例还声明了一个on_start方法。当每个模拟用户启动时,将调用具有此名称的方法。
更多关于软件测试培训的问题,欢迎咨询千锋教育在线名师,如果想要了解我们的师资、课程、项目实操的话可以点击咨询课程顾问,获取试听资格来试听我们的课程,在线零距离接触千锋教育大咖名师,让你轻松从入门到精通。