BaseSelector的模拟子类
mockselector的Python项目详细描述
模拟选择器
说明
这是Python类的集合,旨在帮助测试TCP服务器
基于选择器。mockselector
包提供了轻松编写所需的一切
模拟传入连接和相关联的
输入数据
安装
从PyPI
从0.1.1开始,mockselector
在PyPI上可用。如果你想的话
在您的项目中使用它,推荐的方法是:
pip install mockselector
当然,如果你不想拥有它,可以在相关的venv中完成 在你的主装置里。在
注意:test
文件夹仅在源发行版中可用。在
来自Github
这是推荐的方式,如果你想贡献或只是调整
mockselector
以满足您自己的需求。你可以通过
下载zipfile,但如果您想进行更改,则应该
而是克隆存储库以访问所有git
商品:
然后,可以在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
MockSelector
是selectors.BaseSelector
子类。在创作的时候
获取大量对象。这些对象可以是:
- 将由
select
调用返回的socket.socket
(或Mock
) 以及EVENT_READ
事件 - 将返回的一对
(socket, event)
-这允许传递EVENT_WRITE
事件 - 一个以上元素的集合。它们将在列表中由
单个
select
调用为同时事件
MockSocket
是Mock(socket.socket)
的特化。它的初始值设定项
接受字节字符串或返回字节字符串的函数的iterable。
函数可以作为运行时副作用来设置
服务器,并允许从主循环中干净地退出。
字节字符串由recv
方法一次返回一个。什么时候?
iterable已用尽,recv
返回空字节字符串(b''
)
在套接字上模拟客户端关闭或关闭。在
ListenSocket
用于模拟侦听套接字。它的初始值设定项
socket.socket
对象的iterable(包括普通Mock
或
MockSocket
对象)或返回类似对象的可调用对象。
套接字对象由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.py
和test_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
- 项目
标签: