的Python:单元测试插座为基础的代码?
题
我正在写一个Python客户端+服务器使用gevent.socket
用于通信。有没有(将被拒绝使用无效的证书例如,验证SSL连接)测试插座级操作的代码的任何好办法?或者是简单的,只是spawn
一个真正的服务器?
修改:我不认为“幼稚”嘲讽将是足够的测试,因为所涉及的复杂的相互作用的SSL组件。我错在那?或者是有测试SSL'd东西更好的办法?
解决方案
可以容易地启动一个服务器,然后访问它在一个测试用例。该GEVENT的自己的测试套件正是这么做的测试GEVENT的的内置服务器的。
例如:
class SimpleServer(gevent.server.StreamServer):
def handle(self, socket, address):
socket.sendall('hello and goodbye!')
class Test(unittest.TestCase):
def test(self):
server = SimpleServer(('127.0.0.1', 0))
server.start()
client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
response = client.makefile().read()
assert response == 'hello and goodbye!'
server.stop()
使用0
的端口值意味着服务器将使用任何可用的端口。服务器启动后,通过选择bind
实际值可作为server_port
属性。
StreamServer
支持SSL也通过keyfile
和certfile
参数构造函数,它会缠上SSLObject
每个插槽将它传递给你的处理程序之前。
如果你不使用StreamServer
你的服务器是基于 Greenlet 然后确实产卵这是你应该做的。不要忘了在测试用例结束杀它。
启动服务器,并生成一个greenlet在 GEVENT 快速操作,比创建一个新的线程或进程更快,您可以轻松地创建为每个测试用例一个新的服务器。只是不要忘了清理,只要你不需要服务器了。
我认为没有必要嘲笑任何GEVENT的API,它更容易只是在同一个进程中快乐地生活用它作为服务器和客户机。
其他提示
有另一种(IMO更好)的方式:你应该嘲笑你正在使用的库。 为Python一个例子嘲笑助手是的 MOX 即可。
您不需要一组服务器有一个有效的证书,另一个具有无效证书,根本不需要做任何SSL支持,那些不回应所有任何数据包,等等。你可以模拟一个“虚拟的行为“客户端套接字。它的工作原理与莫克斯的方式是你第一个“教”自己应该期待和它应该如何反应,然后,您就可以执行真实的代码,而交换的嘲笑一个真正的gevent.socket。它需要一些练习来获得它的窍门,但它是值得的。
嘲讽和磕碰是伟大的,但有时你需要把它上升到整合的一个新的水平。由于产卵的服务器,甚至是fakeish一个,可能需要一些时间,考虑单独测试套件(叫他们集成测试)可能是为了。
“测试它像你要使用它”是我指导,如果你嘲笑和存根这么多,你的测试变得微不足道它不是那么有用(虽然几乎所有的测试优于无)。如果您担心处理不好的SSL证书,通过各种手段使一些坏的,写一个测试夹具,你可以喂它们。如果这意味着产卵的服务器,就这样吧。也许如果你的错误就足以将导致重构,这将使它可检验的另一种方式。