什么是TaskSetLocust-05-TaskSet_搜索



顾名思义,​TaskSet​就是任务集合,在前面的学习中,我们已经知道定义一个任务类,然后继承​User​即可实现用户模拟真实操作。但是在实际工作中,我们的系统往往有很多的模块或者有很多类型的操作,为了区分不同的模块,​Locust​给我们提供了​TaskSet​这种对象,方便我们分类。



怎么用TaskSetLocust-05-TaskSet_搜索



假设,我们的系统有两个模块,一个叫做A,一个叫做B,我们想通过​TaskSet​将模块A和B的接口性能测试用例分到两个任务集合中,方便在测试时根据需要选择。


代码:


import time
from locust import HttpUser,task,between,TaskSet
import urllib3
urllib3.disable_warnings()

class AGetIndex(TaskSet):
def on_start(self):
print('主页任务集:这是SETUP,每次实例化User前都会执行!')

@task(1)
def getBaidu(self):
self.client.get(url="/",verify=False)

def on_stop(self):
print('主页任务集:这是TEARDOWN,每次销毁User前都会执行!')

class BSearchPhyger(TaskSet):
def on_start(self):
print('搜索任务集:这是SETUP,每次实例化User前都会执行!')

@task(1)
def searchPhyger(self):
self.client.get(url="/s?wd=phyger",verify=False)

def on_stop(self):
print('搜索任务集:这是TEARDOWN,每次销毁User前都会执行!')

class ATask(HttpUser):

wait_time = between(1, 5)

tasks = [AGetIndex,]

host = 'https://www.baidu.com'

class BTask(HttpUser):

wait_time = between(1, 5)

tasks = [BSearchPhyger,]

host = 'https://www.baidu.com'



# if __name__ == "__main__":
# import os
# os.system("locust -f testpy.py --headless -H https://www.baidu.com -u 100 -r 10 -t 100")


分析:

A和B两个​TaskSet​分别实现对主页的访问和phyger的搜索,同时创建了两个​HttpUser​类,其中​ATask​中添加了​AGetIndex​任务集,​BTask​中添加了​BSearchPhyger​任务集,这样我们可以通过执行不同的用户类执行不同的测试任务集。

当然一个用户中也可以添加多个任务集,这就是​tasks = [BSearchPhyger,]​是一个列表的原因。


执行测试A任务集:


➜ locust git:(master) ✗ locust -f locustfile.py -u 10 -r 10 --headless -t 1 ATask
[2020-11-04 20:52:56,865] ws-hcsebm-0/INFO/locust.main: Run time limit set to 1 seconds
[2020-11-04 20:52:56,865] ws-hcsebm-0/INFO/locust.main: Starting Locust 1.2.2
[2020-11-04 20:52:56,866] ws-hcsebm-0/INFO/locust.runners: Spawning 10 users at the rate 10 users/s (0 users already running)...
Name # reqs # fails | Avg Min Max Median | req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00

主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
主页任务集:这是SETUP,每次实例化User前都会执行!
[2020-11-04 20:52:57,750] ws-hcsebm-0/INFO/locust.main: Time limit reached. Stopping Locust.
[2020-11-04 20:52:57,750] ws-hcsebm-0/INFO/locust.runners: Stopping 9 users
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
主页任务集:这是TEARDOWN,每次销毁User前都会执行!
[2020-11-04 20:52:57,751] ws-hcsebm-0/INFO/locust.runners: 9 Users have been stopped
[2020-11-04 20:52:57,751] ws-hcsebm-0/INFO/locust.main: Running teardowns...
[2020-11-04 20:52:57,751] ws-hcsebm-0/INFO/locust.main: Shutting down (exit code 0), bye.
[2020-11-04 20:52:57,751] ws-hcsebm-0/INFO/locust.main: Cleaning up runner...
Name # reqs # fails | Avg Min Max Median | req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
GET / 9 0(0.00%) | 71 63 79 73 | 10.32 0.00
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 9 0(0.00%) | 71 63 79 73 | 10.32 0.00

Response time percentiles (approximated)
Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
GET / 73 73 74 77 80 80 80 80 80 80 80 9
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
None Aggregated 73 73 74 77 80 80 80 80 80 80 80 9


执行测试B任务集:


➜ locust git:(master) ✗ locust -f locustfile.py -u 10 -r 10 --headless -t 1 BTask
[2020-11-04 20:53:45,875] ws-hcsebm-0/INFO/locust.main: Run time limit set to 1 seconds
[2020-11-04 20:53:45,875] ws-hcsebm-0/INFO/locust.main: Starting Locust 1.2.2
[2020-11-04 20:53:45,876] ws-hcsebm-0/INFO/locust.runners: Spawning 10 users at the rate 10 users/s (0 users already running)...
Name # reqs # fails | Avg Min Max Median | req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00

搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
搜索任务集:这是SETUP,每次实例化User前都会执行!
[2020-11-04 20:53:46,758] ws-hcsebm-0/INFO/locust.main: Time limit reached. Stopping Locust.
[2020-11-04 20:53:46,758] ws-hcsebm-0/INFO/locust.runners: Stopping 9 users
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
搜索任务集:这是TEARDOWN,每次销毁User前都会执行!
[2020-11-04 20:53:46,759] ws-hcsebm-0/INFO/locust.runners: 9 Users have been stopped
[2020-11-04 20:53:46,760] ws-hcsebm-0/INFO/locust.main: Running teardowns...
[2020-11-04 20:53:46,760] ws-hcsebm-0/INFO/locust.main: Shutting down (exit code 0), bye.
[2020-11-04 20:53:46,760] ws-hcsebm-0/INFO/locust.main: Cleaning up runner...
Name # reqs # fails | Avg Min Max Median | req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
GET /s?wd=phyger 8 0(0.00%) | 77 70 94 75 | 10.19 0.00
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 8 0(0.00%) | 77 70 94 75 | 10.19 0.00

Response time percentiles (approximated)
Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
GET /s?wd=phyger 75 78 81 81 95 95 95 95 95 95 95 8
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
None Aggregated 75 78 81 81 95 95 95 95 95 95 95 8


如此一来,我们可以按照模块进行用例分类设计,而且在同一个任务集中,我们可以对不同的任务进行权重的配置,也就是上面代码中的​@task(1)​中的数字。比如在A任务集中,访问​/​的概率是访问​/home/​的概率的两倍,你可以这样做:


@task(1)
def getBaidu(self):
self.client.get(url="/",verify=False)

@task(2)
def getHome(self):
self.client.get(url="/home/",verify=False)


通过以上介绍,我们在实际性能测试中,可以根据系统的实际使用场景和规模进行建模,使用​TaskSet​对系统整体性能进行测试评估。


Locust-05-TaskSet_搜索_03