【Locust】使用FastHttpUser提高Locust性能

## **1、什么是 FastHttpUser**

在介绍FastHttpUser之前,我们先看一下,Locust默认客户端使用的是啥?    

Locust 默认客户端使用的是python-requests。它提供了许多 Python 开发人员都熟悉的很好的 API,并且维护得很好。在python应用中非常广泛,官网是非常推荐我们使用**HttpUser**。

但是,如果我们的测试规模非常大,数据量非常大,这个时候,我们就可以使用Locust官方给出的更快的HTTP client的实现,它使用了geventhttpclient代替了requests,据官方消息,它能提升5-6倍的并发量,是不是很厉害 !!!

注:  
1、提升 5~6倍,这并不意味着每个CPU内核可以模拟的用户数量将自动增加到5至6倍,因为这不去取决于负载测试脚本的其他功能;   
2、如果locust脚本在执行HTTP请求时花费大量的CPU时间,那么将会得到显著的性能提升!


官方给出的区别是FastHttpUser的测试将能够在每个核心每秒执行接近 5000 个请求,而HttpUser则是大约 850 个(在 2018 MacBook Pro i7 上测试) 2.6GHz),在负载生成器CPU没有过载的情况下,FastHttpUser和HttpUser基本相同,更推荐使用HttpUser。   


### 简单了解geventhttpclient

1、geventhttpclient专门为高并发、流传输和支持HTTP 1.1持久连接而设计。    

2、它旨在有效地从REST API和Twitter之类的流API中提取信息。    

3、默认情况下,提供SSL支持。    

> ① geventhttpclient取决于证书CA Bundle。    
> ② 这是与Requests代码库一起提供的相同的CA Bundle,它是从Mozilla Firefox的规范集衍生而来的。

**4、支持**Python 2.7**和**Python 3.4+**。不再支持Python 2.6。**

注:官方不建议将SSL / TLS与python 2.7.9一起使用。

## **2、如何使用FastHttpUser**

只需继承 FastHttpUser 而不是 HttpUser:

```python
from locust import task, FastHttpUser

class MyUser(FastHttpUser):
    @task
    def index(self):
        response = self.client.get("/")
```

看到没有,就是这么简单~   

注:FastHttpUser/geventhttpclient 与 HttpUser/python-requests 非常相似,但有时存在细微差别。如果您使用客户端库的内部结构,例如手动管理 cookie,则尤其如此。所以**FastHttpUser**并不总能代替**HttpUser**,但是**偶尔**可以代替一下

为了验证使用这种方式带来的效果,以一个实验案例为验证locust对测试机器的CPU资源来判断。

#### 实验场景:模拟100虚拟用户打开菜鸟教程python3教程页面。Locust web UI设置如下:

**使用Locust默认HttpUser来实现场景,并执行测试。**   

脚本:

```python
from locust import task,between,HttpUser

class MyUser(HttpUser):
    wait_time = between(3,5)
    @task
    def open_page(self):
        with self.client.get("/python3/python3-tutorial.html",catch_response=True) as res:
            if res.status_code==200:
                res.success()
            else:
                res.failure()
```

执行结果如下:

对测试机CPU消耗: (CPU使用率为6.6%)

**使用FastHttpUser来实现场景,并执行测试。**   

脚本:

```python
from locust import task,between
from locust.contrib.fasthttp import FastHttpUser

class MyUser(FastHttpUser):
    wait_time = between(3,5)
    @task
    def open_page(self):
        with self.client.get("/python3/python3-tutorial.html",catch_response=True) as res:
            if res.status_code==200:
                res.success()
            else:
                res.failure()
```

执行结果如下:

对测试机CPU消耗: (CPU使用率为2.9%)

本次对比测试是跑在虚拟机(4G内存)上,从这样一个简单的对比测试的结果来看,利用FastHttpUser是比较减少资源的消耗的。**在相同的并发条件下使用FastHttpUser能有效减少对负载机的资源消耗从而达到更大的http请求。**

## 3、FastHttpUser 的API 

### 3.1、FastHttpUser类

FastHttpUser与HttpUser(python-requests)相比,使用的是 (geventhttpclient) 这个客户端,

所以:

① 速度比HttpUser 快;

②功能比HttpUser 弱。

该用户的行为由其任务定义。任务可以通过使用 on 方法直接在类上声明,也可以通过设置.@task decoratortasks attribute

此类在实例化时创建一个客户端属性,该属性是一个HTTPClient,支持在请求之间保持用户会话。

接下来,详细看一下:

**1、定义FastHttpUser 类**

```python
#定义FastHttpUser 类

class FastHttpUser(environment)
```

**2、参数及定义**

```python
# 传递给FastHttpSession的参数
connection_timeout: float= 60.0

#参数传递给FastHttpSession。默认值为True,表示不进行SSL验证。
insecure: bool= True

#参数传递给FastHttpSession。默认值5,表示4次重定向。
max_retries: int= 1

#参数传递给FastHttpSession。默认值1,表示零重试。
max_redirects: int= 5

#传递给FastHttpSession的参数
network_timeout: float= 60.0
```

### 3.2、 FastHttpSession类

关于 FastHttpSession类的内容,我们直接代码中解析:

**1、定义FastHttpSession 类**

```python
#定义FastHttpSession 类
class FastHttpUser(environment,base_url,insecure = True,** kwargs)
```

**2、参数及定义**

```python
# 发送get请求
get(Path,**kwargs)

# 发送head请求
head(Path,**kwargs)

# 发送option请求
option(Path,**kwargs)

# 发送patch请求
patch(Path,data = None,**kwargs)

# 发送post请求
post(Path,data = None,**kwargs)

# 发送put请求
put(Path,data = None,**kwargs)

#发送http请求并返回loucst.contrib.fasthttp.FastResponse 对象
request(method, path, name=None, data=None, catch_response=False, stream=False,headers=None, auth=None, json=None, allow_redirects=True, **kwargs)
```

这里我们单独解析一下 request方法里面的参数:

①**method**: 新的request 方法;

②**path**:请求主机地址,url;

③**name**:可选参数,可以指定为在Locust的统计信息中用作标签,而不是URL路径;

④**data**:可选参数,要在请求正文中发送的字符串/字节;

⑤**catch_response**:可选参数,如果已设置,则可用于发出请求,以返回上下文管理器以用作with语句的参数。可自行进行标记,例如200可以设置**Success**,也可以设置成**Fail**。

⑥**stream**:可选参数,

> >如果设置成Ture,则不会立即使用响应主体,而是可以通过访问Response对象上的stream属性来使用它;
> >
> >如果设置成False,在Locust报告的请求时间中不会考虑下载响应内容的时间。

⑦**headers**:与请求一起发送的HTTP headers字典;

⑧**auth**:可选参数,身份认证(用户名、密码等);

⑨**json**:可选参数,在请求正文中发送的字典。

### 3.3、FastResponse类

**1、定义FastResponse 类**

```python
#定义FastResponse 类
classFastResponse(ghc_response, request=None, sent_request=None)
```

**2、参数及定义**

① **content**属性:必要时解压缩并缓冲接收到的正文。注意大文件的情况!

②**headers**:包含响应标头的类对象字典;

③**json()**:将响应解析为json并返回一个dict;

④**text**属性:以解码的字符串形式返回响应的文本内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值