• 1
  • 1
分享

1、什么是 FastHttpUser

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

Locust 默认客户端使用的是python-requests。

>> 如果不了解 python-requests,可以看一下小鱼的这篇:《requests库常用到的7个主要方法及控制访问参数》

或者官方文档,如果有足够耐心的话:《Requests》

我们接着说,使用requests是Pyhton维护非常方便的包,并且在python应用中非常广泛,栗如:爬虫,接口等。

所以,官网是非常推荐我们使用HttpUser。

但是,如果我们的测试规模非常大,数据量非常大,那么这个时候,我们就可以使用 Http客户端,该客户端使用的是geventhttpclient 而不是请求,好处呢,就是进行HTTP请求的性能提高了5~6倍,是不是很厉(尿)害(性) !!!

注:

1、提高 5~6倍,这并不意味着每个CPU内核可以模拟的用户数量将自动增加到5至6倍,因为这不去取决于负载测试脚本的其他功能;

2、如果locust脚本在执行HTTP请求时花费大量的CPU时间,那么将会得到显著的性能提升!

1.1、 geventhttpclient厉害之处

1.1.1 初识 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一起使用。

1.1.2 geventhttpclient实例展示

很简答的一段代码,就是通过geventhttpclient 来获取 请求,响应信息,状态码等数据。 

老规矩,上代码

# -*- coding:utf-8 -*-
# @Time   : 2022-05-28
# @Author : Carl_奕然

from geventhttpclient import HTTPClient
from geventhttpclient.url import URL
url  = URL('http://baidu.com')
http =HTTPClient(url.host)
#获取一个请求
response  = http.get(url.request_uri)
#读取状态码
response.status_code 
#读取返回内容
body = response.read()
#关闭链接
http.close()

1.1.3 高并发 代码实战

HTTPClient具有内置的连接池,可以在多个并发线程中使用同一个实例。

上代码,

# -*- coding:utf-8 -*-
# @Time   : 2022-05-28
# @Author : Carl_奕然

import gevent.pool
import json
from geventhttpclient import HTTPClient
from geventhttpclient.url import URL
#获取某网站的token
Token = '<go to http://developers.xxx.com/tools/explorer and copy the access token>'
url = URL('https://xxx.com/me/friends')
url['access_token'] = Token
#设置 10个并发和10和连接数
http = HTTPClient.from_url(url,concurrency =10)
#设置响应请求
response = http.get(url.request_uri)
#抛出 状态
assert response.status_code == 200
#将读取的信息流,传递到json解析器中
data = json.loads(response)['data']
#定义方法,来打印friend_username
def print_friend_username(http,friend_id):
    #设置 http,friend_id 两个参数
    #url地址拼接
    fiend_url = URL('/'+str(friend_id))
    fiend_url['access_token'] = Token
    #在链接之前,线程会处于阻塞状态
    response = http.get(fiend_url.request_uri)
    assert response.status_code ==200
    
    friend = json.load(response)
    #判断是否存在username 
    if friend.has_key('username'):
        print (f"{firend['username']} :{friend['name']}")
    else:
        print(f"{friend['name'] has no username}")
    #设置一次运行20个线程
    pool = gevent.pool.Pool(20)
    #循环读取
    for item in data:
        friend_id = item['id']
        pool.spawn(print_friend_username,http,friend_id)
    pool.json()
    #关闭 
    http.close()

这里小鱼在强调几点:

1、信息最好是使用json解析器,快捷方便;

2、线程数根据自己是实际业务量来编写;

3、每次执行完,在最后,需要关闭http,不然耗资源。

4、小鱼自认为,注释还算明白,不明白的,可要补基础知识了!

1.1.4 数据流 代码实战

geventhttpclient支持流,这是一大特色,

响应状态具有:read(),readline()方法,他们都是以增量的方式读取。

我们来个例子,看看牛在啥地方

# -*- coding:utf-8 -*-
# @Time   : 2022-05-28
# @Author : Carl_奕然

from geventhttpclient import HTTPClient
from geventhttpclient.url import URL
#本地的文件地址
url = URL('http://127.0.0.1:80/100.dat')
#获取请求
http = HTTPClient.from_url(url)
#获取响应信息
response = http.get(url.query_string)
#抛出200的说明OK的
assert response.status_code == 200
#文件的大小
CHUNK_SIZE = 1024 * 16 # 16KB
#with方法打开文件
with open('/data/100.dat', 'w') as f:
while  data:
f.write(data)
data = response.read(CHUNK_SIZE)

小屌丝:鱼哥,这不就是一个下载大文件的方法吗?

小鱼:是啊,

小屌丝:那这有啥稀奇的,我到没看出来啥道道。

小鱼:那你知道,下载大文件的方法那么多,我为啥偏偏喜欢用 gevent 来下载?

小屌丝:因为你现在不就是在讲 geventhttpclient嘛!(很装叉的样子)

小鱼:还有呢??

小屌丝:额…

小鱼:因为 使用geventhttpclient ,可以节省内存啊 !!!!

小屌丝:挖草~ 这也可以!!

2、如何使用FastHttpUser

我们直接上代码,

在代码中,理解如何使用

# -*- coding:utf-8 -*-
# @Time   : 2022-05-28
# @Author : Carl_奕然

from locust import task,between
from locust.contrib.fasthttp import FastHttpUser
class MyUser(FastHttpUser):
#设置时间间隔在 1~5秒之间
wite_time = (1,5)
@task
def index(self):
response = self.client.get("/")

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

如果没理解@task的用法,可以参照小鱼的上一篇文章,

《深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战》

这里有详细介绍 @task的用法,在本篇不多阐述。

注: 

因为 FastHttpUser 使用的是不同的客户端(geventhttpclient)及API来实现,所以, 并不总能代替HttpUser,但是偶尔可以代替一下!!!!

3、FastHttp 的API 类

3.1、FastHttpUser类

刚刚小鱼也提到了, FastHttpUser与HttpUser(python-requests)相比,

使用的是 (geventhttpclient) 这个客户端,所以:

    ① 速度比HttpUser 快;

    ②功能比HttpUser 弱。

由于该用户的行为由其任务定义,可以通过使用 @task decorator 方法或通过设置来直接在类上声明 ,takss attribute。

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

接下来,详细看一下:

1、定义FastHttpUser 类

#定义FastHttpUser 类
 class FastHttpUser(environment)

2、参数及定义

# 传递给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 类

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

2、参数及定义

# 发送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 类

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

2、参数及定义

    ① content属性:

    必要时解压缩并缓冲接收到的正文。注意大文件的情况!

    ②headers:

    包含响应标头的类对象字典;

    ③json():

    将响应解析为json并返回一个dict;

    ④text属性:

    以解码的字符串形式返回响应的文本内容。 

 


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   引言  一款完整的游戏,不仅有精美的画面,还有符合游戏的音乐、音效与配音。音乐提升玩家氛围,配音引导玩家,音效是游戏内涵的补充,它可以更好展现游戏开发者架构整个游戏的价值取向。  优秀的游戏音效可以让玩家在赏玩游戏之后,产生“余音绕梁三日而不绝” 的共鸣,这样游戏内涵也得到了提升,并更有效地延长了游戏的生命力。  1.游戏音效的分类  (1)环境音效:环境音效主要用于营造场景或者关卡的氛围和情绪,包括了下雨天、刮风、晴天、等天气相关的音效以及风吹的声音等其他与环境有关的音效。  (2)场景音效:场景音效的作用与环境音效一致。是场景内的各类物件的音效,主要是角色同物件交互时的音效。如打碎瓦罐...
            0 0 651
            分享
          • 敏捷质量实践中提倡测试左移,测试人员要尽早介入需求阶段,越早越好。测试人员需要关注需求的有效性,以及在需求产生和传递的过程中,交付价值是否被准确的描述、理解和对齐。在这个过程中很容易遇到一个常见问题:验收标准是验收测试要测的吗?验收标准到底是不是测试用例?这两者之间有什么区别和联系?本文主要想解决的就是这个具体的困惑。验收标准是确保需求实现的最小集合验收标准是什么回顾一下需求由厚厚的《软件需求规格说明书》演化为一张用户故事卡片的过程,在这个过程中我们舍弃了大量的细节描述,突出了需求需要交付的客户/用户价值。在需求交付的过程中,我们会一直关注价值,在保证价值的前提下,实现方式和技术细节都是可以讨...
            0 0 1113
            分享
          • 之前做过一个项目,我们公司内部测试完功能之后,还会拿着项目去竞标,在这个过程中,举办方会拿我们的软件找一些专业的公司做检测,其中有一项就是安全漏洞扫描。其实扫描出来的漏洞,用户平时使用中基本很小的概率碰到,但是举办方会拿着这个说事,要求必须整改。这些安全漏洞中最常见的是csrf跨站攻击,修改起来其实也不是特别麻烦,那我们主要就看下平时测试的时候应该怎么注意才能避免这个问题。【csrf攻击的原理】:用户登录浏览器,打开网页A,输入登录信息并操作网站,在未退出登录的情况下,另外开启一个tabB,访问网站进行操作,由于A的登录信息(cookie)已经存储在浏览器中,此时网页B接收到用户请求后,如果是...
            1 1 11716
            分享
          •   1 一个项目用敏捷管理还是瀑布式管理?  这可能是项目管理专业人士也会有疑惑的问题,早期的PMP认证还是讲五大过程组,讲瀑布式管理,但这两年的的pmp认证加入了更多的敏捷管理的部分。那我们项目到底是用敏捷还是瀑布式管理?  这取决于项目的特征?  学过PMP的的都知道,对于那种传统的、外部环境相对稳定、外部变更较少的项目来说,使用传统的瀑布式管理是可以的。对于需要快速响应市场变化,聚焦客户价值(在初期客户并不一定清楚项目价值),更快更准地发布可以使用的产品,那么使用敏捷管理显然更合适。然后瀑布和敏捷并非互斥的,这两者是可以随着项目的情况,进行一定的融合。 比如大瀑布里的小敏捷,大敏捷里的小...
            0 0 957
            分享
          • 部门最近的H5相关项目挺多的,由于团队之前接触的大多是Web项目,很少涉及H5,想着给团队成员培训下,减少漏测率,于是整理了一个文档。别说,效果还挺不错的,连着上线6个版本,都没有收到业务方反馈Bug,好东西不能独享,分享给大家,希望对大家有所启发。一、功能测试1、业务逻辑与Web测试一样,参照产品原型,把业务逻辑都覆盖一遍即可。H5页面也能在PC端访问,Chrome对H5支持最好,功能相关的测试可以在PC端Chrome下先测试,也可以直接在手机上测试。2、登录授权浏览器打开时,需要登录;客户端内打开时,如果已经登录,则无需再登录,如果未登录,则需要登录授权。3、翻页需要测试1页或多页的场景,...
            0 0 1296
            分享
      • 51testing软件测试圈微信