8-更大并、可混合接口模式压测的FastHttpUser
FastHttpUser
和HttpUser相比,这个类的运行占用更少压测机的CPU并且可以支撑更大的并发数,并且可以配合gevent类来实现接口混合模式压测(一个user在几乎同一时间并发多个api请求),直接上例子
import time
from gevent.pool import Pool
from locust import FastHttpUser, task
def api_01():
print(time.time())
time.sleep(5)
print('api1')
def api_02():
print(time.time())
print('api2')
def api_03():
print(time.time())
print('api3')
class MyFastHttpUser(FastHttpUser):
host = 'https://www.baidu.com'
@task
def test_01(self):
p = Pool()
p.spawn(api_03())
p.spawn(api_02())
p.spawn(api_01())
p.join()
[2023-09-19 15:04:59,369] HUAWEI-MateBook-X-Pro.local/INFO/locust.main: Run time limit set to 10 seconds
[2023-09-19 15:04:59,369] HUAWEI-MateBook-X-Pro.local/INFO/locust.main: Starting Locust 2.15.1
[2023-09-19 15:04:59,370] HUAWEI-MateBook-X-Pro.local/INFO/locust.runners: Ramping to 1 users at a rate of 1.00 per second
[2023-09-19 15:04:59,370] HUAWEI-MateBook-X-Pro.local/INFO/locust.runners: All users spawned: {"MyFastHttpUser": 1} (1 total users)
1695107099.3706381
api3
1695107099.370649
api2
1695107099.3706539
api1
1695107104.3773599
api3
1695107104.377412
api2
1695107104.377436
从结果可以看出,每一次user执行时,3个请求几乎是同一时间发起的,用过jmeter都知道,jmeter一个线程组的http取样器的执行是串行的,也就是说第一个取样器没结束请求前,第二个取样器是不会发起请求的,而当我们需要模拟一个页面的并发访问(前端发起请求大多数是使用异步并发请求),使用jmeter就肯定模拟不出来,因此使用locust的fasthttpuser
就可以解决该问题。同时也可以配置每个请求的超时时间,避免某次请求等待时间太长,影响整体测试结果,代码如下:
class MyFastHttpUser(FastHttpUser):
host = 'https://www.baidu.com'
network_timeout = 10.0 # 直接重写FastHttpUser的network_timeout属性即可,最长请求时间修改为10s