蝗虫骨架扩展

locustio-backpack的Python项目详细描述


蝗虫背包

蝗虫背包是蝗虫负载测试框架的一个扩展,旨在简化负载测试脚本的编写,同时增加一些功能和令人敬畏的特性。

模块背后的主要思想是"端点作为对象"。 这意味着更少的硬编码、更少的决策块、更少的错误和bug、更少的压力和更多的乐趣。

开始

开始使用背包很简单。将模块放入工作目录后,从蝗虫脚本导入:

import locust_backpack as Backpack

在这一点上,你是一个自豪的用户蝗虫背包。该开始工作了。

初始化

如前所述,背包的意识形态是"作为对象的端点"。因此,我们必须从所有端点创建对象,这些对象稍后将在负载测试中使用。

这可以在taskset子类之外、在不同的文件中或我们喜欢的任何地方完成。

保存端点数据的主类是LocStendPoint。每个端点都必须使用此类的实例初始化,并接受以下参数:

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
<表><广告>参数 说明 默认值 < /广告><正文>终点(str)表示实际端点的字符串 n/a方法(str或list)包含端点支持的所有方法的字符串或列表 n/a姓名(str)表示终结点的友好名称或调试名称的字符串。这是端点在蝗虫用户界面上的名称name=终点标题(dict)此终结点将使用的标题{}正文(dict)此终结点将使用的主体{}< Buff行情>

注意:初始化locstendpoint时传递的值不是永久的。这些可以在测试期间随时修改!

示例:

仅强制参数:

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
PvP2Init = Backpack.LocustEndpoint('/public/pvp2/v1/init', ['post', 'get'])

传递自定义名称

ResetSession = Backpack.LocustEndpoint('/public/session/v1/cheat/reset','post',
            name="/public/session/v1/cheat/reset::newUser")

通过身体

SessionStart = Backpack.LocustEndpoint('/public/session/v1/start', 'post',
            name="/public/session/v1/start::newUser", 
            body={"device_type": "test",
                    "device_id": "test", 
                    "version": 320, 
                    "language": "RO", 
                    "gender": 1, 
                    "name": "load_test", 
                    "platform": 1})

一旦创建了所有的蝗虫点,我们需要访问任务集,以便能够使用蝗虫发出请求。这可以通过两种方式实现:

循环遍历所有终结点的列表并将其attach()方法应用于当前上下文:

for endp in [TeamInit, ResetSession, SessionStart, PvP2Init, EventInit]:
    endp.attach(self)

调用backpack方法unzip()与上述方法相同,但不必提供蝗虫点列表

Backpack.Unzip(self)

提出请求

简单请求

还记得self.client.post(…)?算了吧。

蝗虫背包提供了一种更简单的方式来发出请求并跟踪其结果:

TeamInit.Request()

import locust_backpack as Backpack
0

在初始化locstendpoint时,如果不使用参数调用request(),则将使用端点的passed方法。指定一个方法将使用方法池中的该方法。

< Buff行情>

注意:如果用方法列表初始化了locustendpoint,并且调用了无参数的request(),则会抛出missingMethodException!

但是,当我们locstendpoint.request()时,在幕后会发生什么呢?

< Buff行情>
  • 发出self.client.method(*args)请求,遵循蝗虫样式并使用默认或提供的方法
  • 执行状态代码检查,为蝗虫注册request.success或request.failure
  • 将创建一个result对象,其中包含所有请求信息

简单链接依赖请求

如果我们想连接多个请求,但是我们希望只有在前一个请求成功的情况下才能发出每个后续请求,那会怎么样?再简单不过了!

import locust_backpack as Backpack
1

…说真的,就这些…

以上内容翻译为:

< Buff行情>
  • 请求重置会话
  • 检查复位会话的结果
  • 如果resetsession成功,请向sessionstart发出请求

当然,可以链接任意数量的请求:

import locust_backpack as Backpack
2

假设teaminit在上述场景中失败。在这种情况下,由于依赖关系链从那时起就失败了,因此不会执行随后的任何请求。

< Buff行情>

注意:简单的链接在请求之间没有等待时间。如果成功,每个请求都将在前一个请求之后立即发出

< Buff行情>

注意:简单链接只支持用单个方法声明的locustendpoints


高级链接相关请求

为了解决简单链接的局限性,创建了高级链接。 高级链接由backpack类chain()定义,如下所示:

import locust_backpack as Backpack
3 <表><广告>参数 说明 默认值 < /广告><正文>端点(元组列表)包含端点的元组列表及其方法 n/a独立(bool)提供的端点是否取决于上一个端点的成功false等待(int)整数,表示在发出所提供的请求之间等待的时间 0

示例:

import locust_backpack as Backpack
4

情景

如果有一种简单的方法来构建和运行场景呢?好吧,没有一种方法可以做到,而是多种方法。

简单场景

构建场景的最基本方法是背包的scenario()类。

场景(self,endpoints,wait=1,runtime=none,independent_requests=false)

<表><广告>参数 说明 默认值 < /广告><正文>端点(元组列表)包含端点的元组列表及其方法 n/a等待(int)整数,表示发出所提供请求之间等待的时间(秒)1运行时(int)表示方案运行时(秒)的整数 独立请求(bool)提供的端点是否取决于上一个端点的成功false

示例:

import locust_backpack as Backpack
5
import locust_backpack as Backpack
6

但这种情况还不会发生!有两种方法可用于运行场景:

import locust_backpack as Backpack
7

或者,如果您只想运行场景一次,而不考虑运行时:

import locust_backpack as Backpack
8

加权情景

也许我们想在运行场景时为端点添加一个机会。 为此,weightedscenario()开始发挥作用。子类化这个简单的场景,它们之间只有两个细微的区别:

< Buff行情>
  • weightedscenario()没有独立的_requests参数
  • 传递给weightedscenario()的元组有一个第三个元素,表示1到100之间的整数,这是发出请求的机会(100表示100%的机会)

示例:

import locust_backpack as Backpack
9

import locust_backpack as Backpack
8

序列scenario(WIP)< /H3>

另一种构建场景的方法是使用backpack.sequencescenario()功能

这个场景生成器的特殊之处在于它能够接收元组列表或元组列表的元组列表。

示例:

首先,我们定义了一些序列。这些是包含locstendpoint的元组列表,它是一个方法,还有一个可选的权重/机会

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
1

然后我们通过传递上面的序列和一个可选的权重/机会来构建序列场景。

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
2

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
3

然后我们终于可以调用run()方法:

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
4

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
5

结果对象

每当locustendpoint发出请求时,都会创建一个result对象。对该locustendpoint的每个后续请求都将覆盖上一个result对象。

这个result对象保存有关其端点的最新请求的信息,并具有一些有用的属性:

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
6
LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
7

依赖关系构建

蝗虫背包很深,有很多口袋。

假设有一个端点需要来自另一个端点的响应的元素。当然,我们可以解析响应并将特定的键/元素分配给另一个端点,但是为什么每次都会遇到这些麻烦呢?

例如,假设有一个端点eventinit需要另一个端点sessionstart的键

我们可以在蝗虫脚本中的任何位置永久声明此依赖项,如下所示:

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
8

一旦完成,每个成功的sessionstart请求都将把它的player键分配给eventinit的主体,使eventinit在以后的请求中使用它。

其他功能

别以为就这些。这个背包是为长途旅行准备的。


密封和启封

每个蝗虫叮咬点都具有密封和启封功能,可使用

LocustEndpoint(self, endpoint, methods, name=None, headers=None, body=None)
9
TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
0

封端意味着在未封端之前,该端点将无法再发出任何请求。

这不会以任何方式干扰脚本逻辑,但一旦到达密封的端点请求,请求部分将被跳过,并且该端点的最新结果将设置为静默失败(在任何地方都未注册)

还有一种方法可以同时密封和启封所有蝗虫点:

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
1
TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
2

检查请求是否成功

除了使用result()对象访问有关最新请求的所有信息(包括使用eventinit.result.success的success)之外,我们还可以使用更简单、更快的方法:

更具体地说,我们可以检查蝗虫点实例的真实性

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
3

换句话说,以下两种方法的结果完全相同:

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
4
TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
5

质量分配

如前所述,locstendpoint的属性可以随时更改。但是,如果要为所有(或多个)蝗虫点修改或创建变量,该怎么办?

这是通过使用backpack.setglobal()来实现的 <表><广告>参数 说明 默认值 < /广告><正文>变量(str)要修改或创建的变量 n/a价值(任何)变量值 n/a选择性(列表)表示方案运行时(秒)的整数 所有蝗虫密度点

示例:

为所有蝗虫点设置相同的报头

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
6

或仅针对特定的蝗虫点

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
7
< H2>拉链(WIP)

每一个拉开拉链的背包都应该拉开拉链。从中失去任何东西都是微不足道的。

为此,创建了backpack函数zip()

从当前测试中的任何位置调用backpack.zip()都会将所有测试数据保存到工作区中的文件夹中。

zip()将:

< Buff行情>
  • 检查蝗虫地址"http://localhost:8089/" rel="nofollow">http://localhost:8089/"是否可访问
  • 下载蝗虫.csv文件
  • 建立蝗虫统计页面的克隆
  • 使用seaborn绘制测试详细信息
  • 很好地将所有内容保存到当前工作目录中带日期戳的文件夹中
< Buff行情> 注意!由于所有压缩操作都是在本地主机url上完成的,因此zip()只能由蝗虫主机调用

LocStendPoint请求的流程图

TeamInit = Backpack.LocustEndpoint('/public/team/v1/init', 'post')
8

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
为什么在Set/List/Map中包装元素的方法名称中包含“singleton”?(java.util.Collections)   java矩形类和containsPoint方法   java为什么log4j2中的monitorInterval没有重新加载记录器   java为什么强制转换为int会给我8而不是0?   java在处理JSP页面[/views/index.JSP]时发生异常   java-Android清洁体系结构双重实现   未找到R和H2O初始化Java路径中的错误   java开发和配置视图和控制器   java Spring JSTL日期格式转换为DDMMYYYY   java机制不工作?   java上下文初始化失败。Spring错误NoSuchMethodException   从Java读取COBOL数据结构的数据结构   java对话框不显示安卓   Java中HashMap的解析   velocity中的java全局上下文   尝试模拟静态(不兼容的依赖项)时出现java NoClassDefFoundError或NoSuchMethodError   java失败[INSTALL_FAILED_UID_CHANGED]发生在应用程序调试时,即使在工厂重置后也是如此   java在序列化为JSON时忽略子属性   JComboBox的java实例