BaseSelector的模拟子类

mockselector的Python项目详细描述


Build Statuscodecov

模拟选择器

说明

这是Python类的集合,旨在帮助测试TCP服务器 基于选择器。mockselector包提供了轻松编写所需的一切 模拟传入连接和相关联的 输入数据

安装

从PyPI

从0.1.1开始,mockselector在PyPI上可用。如果你想的话 在您的项目中使用它,推荐的方法是:

pip install mockselector

当然,如果你不想拥有它,可以在相关的venv中完成 在你的主装置里。在

注意:test文件夹仅在源发行版中可用。在

来自Github

这是推荐的方式,如果你想贡献或只是调整 mockselector以满足您自己的需求。你可以通过 下载zipfile,但如果您想进行更改,则应该 而是克隆存储库以访问所有git商品:

^{pr2}$

然后,可以在Python主安装中或在venv中安装它:

pip install -e .

或者在带有启动器的Windows上:

py -m pip install -e .

第一次安装时应使用pip,以便 setuptools-scm从git元数据生成{}文件。 完成后,setup.py就可以使用了,没有特殊问题。在

或者,您可以手动安装setuptools-scm

pip install setuptools-scm
python setup.py install

特殊处理version.py:

mockselector依赖setuptools-scm自动提取 git元数据中的版本号,并将其存储在version.py文件中 供以后使用。需要git(这应该是 从Github下载项目时不是问题),并且 setuptools-scm。如果它失败是因为一个不可用或 git元数据不存在(如果您只从 Github),版本设置为0.0.0

因此,如果不使用git下载源代码,那么 应该从PyPI下载一个源发行版,因为后者 包含有效的version.py

pip使用与PEP-518和 PEP-517知道在构建之前setuptools-scm是必需的。在

基本用途

安装后,您可以轻松地将其导入到测试中。在

from mockselector.selector import MockSocket, ListenSocket, MockSelector

MockSelectorselectors.BaseSelector子类。在创作的时候 获取大量对象。这些对象可以是:

  • 将由select调用返回的socket.socket(或Mock) 以及EVENT_READ事件
  • 将返回的一对(socket, event)-这允许传递 EVENT_WRITE事件
  • 一个以上元素的集合。它们将在列表中由 单个select调用为同时事件

MockSocketMock(socket.socket)的特化。它的初始值设定项 接受字节字符串或返回字节字符串的函数的iterable。 函数可以作为运行时副作用来设置 服务器,并允许从主循环中干净地退出。 字节字符串由recv方法一次返回一个。什么时候? iterable已用尽,recv返回空字节字符串(b'') 在套接字上模拟客户端关闭或关闭。在

ListenSocket用于模拟侦听套接字。它的初始值设定项 socket.socket对象的iterable(包括普通MockMockSocket对象)或返回类似对象的可调用对象。 套接字对象由accept方法一次返回一个。在

典型用途

面对一个主服务器环路:

        ...
        s = socket.socket()
        s.bind(('0.0.0.0', self.port))
        s.listen()
        sel = DefaultSelector()
        sel.register(s, EVENT_READ)
        while not self.stop:
            for key, event in sel.select():
                if key.fileobj == s:
                    c, _ = s.accept()
                    sel.register(c, EVENT_READ)
                else:
                    c = key.fileobj
                    data = c.recv(1024)
                    if len(data) == 0:
                        sel.unregister(c)
                        c.close()
                    else:
                        # process received data
                        ...

您可以:

    def test_run_stop(self):
        def do_stop(serv):
            serv.stop = True
            return b''
        serv = ...                  # an instance or the serveur to test
        c1 = MockSocket([...])      # a client with its data
        c2 = MockSocket([..., lambda: do_stop(serv)]) # another client asking for end of server loop
        s = ListenSocket((c1, c2))
        sel = MockSelector([s, c1, s, c2, c2, (c1, c2), c1, c2, c2]) # ordered list of events
        with patch('socket.socket') as socket, \
                patch('miniserv.DefaultSelector') as selector:
            socket.return_value = s
            selector.return_value = sel
            serv.run()

您可以在miniserv.pytest_miniserv.py中找到完整的代码示例 测试文件夹中的文件

先进的使用和贡献

如果您想定制包,它已经包含了许多测试。 您可以从顶部文件夹运行所有这些文件:

python setup.py install -e    # edit mode of install to use the local folder
python -m unittest discover

我将很高兴收到的问题,将有助于改善这个项目。。。在

免责声明:beta质量

即使这个软件包有很好的测试覆盖率(95%以上),但目前只有 包含了我需要测试的另一个项目。它可能不会相遇 你自己的需求,或主要包含尚未确认的错误。。。在

它仍然是0.x版本,因此不能保证API是稳定的。在

许可证

那项工作有麻省理工学院的执照。见LICENSE.txt

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

推荐PyPI第三方库


热门话题
检查java中两个链表之间的子集   java仅在findViewById()下显示一个ImageButton   在Java Graphics2D中,文本如何在矩形上居中对齐?   java需要一个用于电子表格计算器的正则表达式   ^java中的运算符   java通过一些属性配置文件根据环境动态更改wsdl端点URL   java Ebean/Play框架关系未更新   集合如何将POJO列表转换为Java流中的映射<String,List>?   java为什么JFrame不显示整个图像?   java如何将调用静态导入的泛型方法的结果传递给另一个方法?   迭代器或foreach中的java延迟   需要java socket logback日志接收器   在Java中初始化Map的静态数组   雅加达邮件Java MimeMail:解码后获得额外字符   java为什么这个xmldom解析器不能正确解析rtept、name和cmt标记?   java如何刷新Log4J2中的异步记录器(带中断器)   java使用构建插件pom生成的jar。xml作为同一pom中的依赖项   java基于位置的序列ADT如何在O(1)时间内插入元素?   java ORM实体与DDD实体   Java对象分配