• 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()

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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 性能测试是软件开发和应用过程中至关重要的环节。它是评估系统性能、稳定性和可扩展性的有效手段,可以确保软件在真实环境中高效运行。在现代技术快速发展的时代,性能测试的重要性愈发显著。性能测试在软件开发和应用过程中的重要性不可低估。它是保障用户体验、发现潜在问题、提高系统可靠性的关键手段。同时,遵循性能测试的最佳实践,能够确保测试的准确性和可靠性,提高测试效率,为软件开发和应用提供有力的保障。只有重视性能测试,并遵循最佳实践,我们才能构建稳定、高效的应用,满足用户对技术的不断追求和挑战。下面分享几个性能测试中最佳实践,以供参考。# 设定明确的性能目标在开始性能测试之前,首要任务是设定明确的性能目标。...
            0 0 911
            分享
          •   Nose是一个Python单元测试的扩展,能自动发现并运行测试,使得测试更容易。  框架介绍  nose是一个第三方单元测试框架,它完全兼容unittest,并且号称是一个更好用的测试框架。  1、用例的编写方式除了编写继承于unittest.TestCase的测试类外,还可以编写成没有继承的测试类。同时nose也支持定义函数来作为测试。  2、unittest所支持的用例发现和执行能力,nose均支持,nose支持用例自动(递归)发现。  3、使用nosetests命令,默认发现当前目录下所有包含test的测试用例,不包括以 _ 开头的用例。  4、通过-w参数指定要自动发现的目录,-m...
            11 11 1941
            分享
          • 1、接口测试接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。由于如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,所以就要做接口测试。同时,接口测试相对容易实现自动化持续集成,且相对UI自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。接口持续集成是为什么能低成本高收益的根源。现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易...
            11 11 1086
            分享
          •   最近在测试的产品是一个类似于途牛的旅游网站,公司只有本人一个菜鸟测试,之前从未接触过测试相关。最近在提Bug的时候,发现自己越来越容易纠结于一个Bug到底是该分给前端还是后台。之前测试其他产品的时候,由于业务逻辑相对简单,Bug也不多,也就很少留意到这个问题,但是现在手头的项目让我对于Bug定位的问题再也无法忽略。遂查了一些资料,再加上自己的理解,输出了这篇文章,谨以记录以及相互的交流学习,如有不当之处,欢迎指出。  首先,搞不清一个Bug到底归属前端还是后台的根本原因就是对于这二者的概念模糊。综合网上的资料来看,个人归纳为:  前端是用户看得见摸得着的东西,主要体现在页面的视觉效果以及交...
            3 3 3723
            分享
          •   埃森哲对敏捷测试的定义(与维基百科的定义基本一致)大概如此:敏捷测试是遵从敏捷软件开发原则的一种测试实践。敏捷开发模式把测试集成到了整个开发流程中而不再把它当成一个独立的阶段。因此测试变成了整个软件开发过程中非常重要的环节。敏捷测试包含了具备专业技能测试人员在内的跨职能团队,这使得这种组合式的团队能更好的交付价值,满足项目的业务、质量和进度目标。  从定义中可以看出敏捷测试主要的核心内涵有三个:  1. 是遵从敏捷开发的原则(强调遵守)  2. 测试被包含在整体开发流程中(强调融合)  3. 跨职能团队(强调协作)  除此之外,敏捷测试用到的基本测试方法和技术与传统测试是一样的。  敏捷测...
            12 12 1663
            分享
      • 51testing软件测试圈微信