• 1
  • 1
分享

1、引言

我们今天来看看Locust如何自定义客户端测试系统的 ,

由于基础内容,在第一章节,已经介绍完。

所以本章内容,就是实例展示!!

2、实例展示

2.1 定义

Locust以HTTP为主要目标构建。但是,通过编写触发request_success 和request_failure事件的自定义客户端,可以轻松扩展对任何基于请求/响应的系统进行负载测试。

2.2 客户端代码展示

我们使用User类XmlRpcUser的示例,来看看XmlRpcUser如何发送请求。

老规矩,上代码

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

import time
from xmlrpc.client import ServerProxy, Fault
from locust import User, task, between
class XmlRpcClient(ServerProxy):
    """
    Simple, sample XML RPC client implementation that wraps xmlrpclib.ServerProxy and
    fires locust events on request_success and request_failure, so that all requests
    gets tracked in locust's statistics.
    """
    _locust_environment = None
    def __getattr__(self, name):
        func = ServerProxy.__getattr__(self, name)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            try:
                result = func(*args, **kwargs)
            except Fault as e:
                total_time = int((time.time() - start_time) * 1000)
                self._locust_environment.events.request_failure.fire(
                    request_type="xmlrpc", name=name, response_time=total_time, exception=e
                )
            else:
                total_time = int((time.time() - start_time) * 1000)
                self._locust_environment.events.request_success.fire(
                    request_type="xmlrpc", name=name, response_time=total_time, response_length=0
                )
                # In this example, I've hardcoded response_length=0. If we would want the response length to be
                # reported correctly in the statistics, we would probably need to hook in at a lower level
        return wrapper
class XmlRpcUser(User):
    """
    This is the abstract User class which should be subclassed. It provides an XML-RPC client
    that can be used to make XML-RPC requests that will be tracked in Locust's statistics.
    """
    abstract = True
    def __init__(self, *args, **kwargs):
        super(XmlRpcUser, self).__init__(*args, **kwargs)
        self.client = XmlRpcClient(self.host)
        self.client._locust_environment = self.environment
class ApiUser(XmlRpcUser):
    host = "http://127.0.0.1:8877/"
    wait_time = between(0.1, 1)
    @task(10)
    def get_time(self):
        self.client.get_time()
    @task(5)
    def get_random_number(self):
        self.client.get_random_number(0, 100)

这段示例,也是没有什么难度,如果 通过Locust编写过测试脚本或者进行过测试,那么就很容易理解。

但是,在这里,小鱼还是强调一次,

在这段代码中:

①你可以认识到ApiUser的类,这是一个普通的类,只是声明了几个任务;

②ApiUser继承自XmlRpcUser ,这个可以在ApiUser类上看到;

③abstract = True,则标记为Locust不会尝试从该类创建模拟用户(仅扩展该类的类)。

④ XmlRpcUser在客户端属性下提供XmlRpcClient的实例。

2.3 服务器端代码展示

这是XML-RPC服务器的实现,该服务器可用作客户端代码的服务器。

代码展示:

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

import time
from xmlrpc.server import SimpleXMLRPCServer
def get_time():
    time.sleep(random.random())
    return time.time()
def get_random_number(low, high):
    time.sleep(random.random())
    return random.randint(low, high)
server = SimpleXMLRPCServer(("localhost", 8877))
print("Listening on port 8877...")
server.register_function(get_time, "get_time")
server.register_function(get_random_number, "get_random_number")
server.serve_forever()

今天的代码,就分享到这里,代码很简单,希望熟练掌握。

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 接口自动化的工具现在有很多个选择,本篇文章着重介绍YAPI的使用方法;1、它首先是一个很好的接口维护的工具;开发同学的接口文档可以在此工具上维护;现在很多的文档的维护都是多人协同维护了,例如jira、石墨等。相对于postman更倾向于本地化,YAPI更能提现协同合作的优势。开发同学可以根据各自的分工来分别维护自己所负责模块的接口;而组长有分配的权限来给各个成员分配各个模块的查看和编辑的权限;在接口的编辑页面可以整理自己接口的信息,请求的参数以及返回的结构和信息,各种备注等等;开发的同学在维护完成接口后,测试同学就可以运动接口来进行接口的测试以及测试集合自动化测试的case编写了。2、单个接口...
            14 13 2840
            分享
          • 一、软件质量特性1、静态质量特性代码:构化的、可维护的、可测试的。 文档:正确的、完整的。2、动态质量特性正确性:如果软件针对其输入域(对软件p的所有可能输入的集合被称作p的输入域,或者输入空间)中的每个元素都如期所望的那样运行,则称该软件是正确的。正确性是想说明软件是无错的,这是我们所追求的一个良好的愿望,但并不是软件测试的目标。正确性是通过对程序的属性证明建立起来的。测试、诊断、纠错、调试、验证过程共同增强了我们对北侧软件正确运行的信心。可靠性:软件可靠性是指软件在给定时间间隔和给定条件下无故障运行的概率。可靠性是指软件在预期环境下无故障运行的概率。完整性:指全部得到软件需求规格说明或者用...
            0 0 1168
            分享
          • 场景一:首次访问检查本地是否存储用户信息(否)页面显示微信用户授权按钮用户点击按钮允许授权使用用户信息页面显示微信用户登录按钮用户点击登录按钮检查数据库中有无用户信息(无)创建新的用户信息查询出新的用户信息本地存储用户信息进入主页场景二:再次访问检查本地是否存储用户信息(有)页面显示微信用户登录按钮用户点击登录按钮进入主页场景三:用户退出(删除本地存储的用户信息)后再访问检查本地是否存储用户信息(否)页面显示微信用户授权按钮用户点击按钮允许授权使用用户信息页面显示微信用户登录按钮用户点击登录按钮检查数据库中有无用户信息(有)本地存储用户信息进入主页优点:用户不退出的情况下,再次访问时不需要查询...
            0 0 1000
            分享
          • (1)MantisMantis是一个基于PHP技术的轻量级的开源缺陷跟踪系统,其功能与JIRA系统类似,都是以Web操作的形式提供项目管理及缺陷跟踪服务。在功能上可能没有JIRA那么专业,界面也没有JIRA漂亮,但在实用性上足以满足中小型项目的管理及跟踪。Mantis基本功能介绍http://tb.blog.csdn.net/TrackBack.aspx?PostId=作者:龚云卿???? 2005年8月1、简介缺陷管理贯穿于整个软件开发生命周期中, 是不可缺少的环节。Mantis是PHP/MySQL/Web-based缺陷跟踪系统,Mantis当前版本为1.0.0a3。关于产品详细信息和支持...
            15 15 1429
            分享
          •   对于Bug跟踪分析这块,从我个人这几年的工作经验来看,大部分测试人员一般关注的都是从新建到关闭的这条工作流程。  至于跟踪过程中和开发人员沟通过程中会遇到各种各样的问题,至于这些问题有没有一个可通用的模板。  亦或者Bug关闭后有没有进行有效的分析,是什么原因导致的,对于后续测试过程有没有什么参考价值?  后面我提到的问题,工作2-3年的测试人好像极少有考虑到的,如果每次对Bug都进行及时有效的分析,我相信对于个人成长会有很大的帮助。  Bug跟踪的一般流程  这里叙述一下正常我们Bug跟踪的流程都有哪些步骤:新建->修改/非Bug->验证->关闭/打回。  新建:提交问...
            0 0 959
            分享
      • 51testing软件测试圈微信