python – 如何在单元测试中杀死套接字以进行重新连接测试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何在单元测试中杀死套接字以进行重新连接测试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2493字,纯文字阅读大概需要4分钟。
内容图文
![python – 如何在单元测试中杀死套接字以进行重新连接测试](/upload/InfoBanner/zyjiaocheng/777/fc1c2ed17e02416b8afa51b1a5078685.jpg)
我正在尝试测试一些在断开连接后重新连接到服务器的代码.这在测试之外完全正常,但它无法确认套接字在运行测试时已断开连接.
我正在使用Gevent Stream Server来模拟真实的侦听服务器:
import gevent.server
from gevent import queue
class TestServer(gevent.server.StreamServer):
def __init__(self, *args, **kwargs):
super(TestServer, self).__init__(*args, **kwargs)
self.sockets = {}
def handle(self, socket, address):
self.sockets[address] = (socket, queue.Queue())
socket.sendall('testing the connection\r\n')
gevent.spawn(self.recv, address)
def recv(self, address):
socket = self.sockets[address][0]
queue = self.sockets[address][1]
print 'Connection accepted %s:%d' % address
try:
for data in socket.recv(1024):
queue.put(data)
except:
pass
def murder(self):
self.stop()
for sock in self.sockets.iteritems():
print sock
sock[1][0].shutdown(socket.SHUT_RDWR)
sock[1][0].close()
self.sockets = {}
def run_server():
test_server = TestServer(('127.0.0.1', 10666))
test_server.start()
return test_server
我的测试看起来像这样:
def test_can_reconnect(self):
test_server = run_server()
client_config = {'host': '127.0.0.1', 'port': 10666}
client = Connection('test client', client_config, get_config())
client.connect()
assert client.socket_connected
test_server.murder()
#time.sleep(4) #tried sleeping. no dice.
assert not client.socket_connected
assert client.server_disconnect
test_server = run_server()
client.reconnect()
assert client.socket_connected
它在assert而不是client.socket_connected时失败了.
我在recv期间检测到“not data”.如果它是None,那么我设置一些变量,以便其他代码可以决定是否重新连接(如果是user_disconnect则不重新连接,等等).这种行为起作用,过去一直对我有用,我直到现在才尝试对它进行测试.套接字连接和本地函数范围有什么奇怪之处吗?就像停止服务器后连接仍然存在一样.
我正在尝试测试的代码是开放的:https://github.com/kyleterry/tenyks.git
如果您运行测试,您将看到我正在尝试修复的测试失败.
解决方法:
尝试使用真正的套接字运行单元测试是一个艰难的行.这将是棘手的,因为一次只能运行一组测试,因为将使用服务器端口,并且随着套接字的设置和拆除,它将会变慢.最重要的是,如果这实际上是一个单元测试,你不想测试套接字,只需要使用套接字的代码.
如果你模拟套接字调用,你可以从模拟的代码中抛出异常,并确保使用套接字的代码做正确的事情.你不需要一个真正的套接字来确保被测试的类做正确的事情,你可以伪造它,如果你可以将套接字调用包装在一个对象中.在构建类时传递对套接字对象的引用,然后您就可以开始了.
我的建议是将套接字调用包装在一个支持sendall,recv和你在套接字上调用的所有方法的类中.然后你可以用TestReconnectSocket(或其他)替换实际的Socket类并运行你的测试.
看看mox,一个python模拟框架.
内容总结
以上是互联网集市为您收集整理的python – 如何在单元测试中杀死套接字以进行重新连接测试全部内容,希望文章能够帮你解决python – 如何在单元测试中杀死套接字以进行重新连接测试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。