我正在写一个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也通过keyfilecertfile参数构造函数,它会缠上SSLObject每个插槽将它传递给你的处理程序之前。

如果你不使用StreamServer你的服务器是基于 Greenlet 然后确实产卵这是你应该做的。不要忘了在测试用例结束杀它。

启动服务器,并生成一个greenlet在 GEVENT 快速操作,比创建一个新的线程或进程更快,您可以轻松地创建为每个测试用例一个新的服务器。只是不要忘了清理,只要你不需要服务器了。

我认为没有必要嘲笑任何GEVENT的API,它更容易只是在同一个进程中快乐地生活用它作为服务器和客户机。

其他提示

有另一种(IMO更好)的方式:你应该嘲笑你正在使用的库。 为Python一个例子嘲笑助手是的 MOX 即可。

您不需要一组服务器有一个有效的证书,另一个具有无效证书,根本不需要做任何SSL支持,那些不回应所有任何数据包,等等。你可以模拟一个“虚拟的行为“客户端套接字。它的工作原理与莫克斯的方式是你第一个“教”自己应该期待和它应该如何反应,然后,您就可以执行真实的代码,而交换的嘲笑一个真正的gevent.socket。它需要一些练习来获得它的窍门,但它是值得的。

嘲讽和磕碰是伟大的,但有时你需要把它上升到整合的一个新的水平。由于产卵的服务器,甚至是fakeish一个,可能需要一些时间,考虑单独测试套件(叫他们集成测试)可能是为了。

“测试它像你要使用它”是我指导,如果你嘲笑和存根这么多,你的测试变得微不足道它不是那么有用(虽然几乎所有的测试优于无)。如果您担心处理不好的SSL证书,通过各种手段使一些坏的,写一个测试夹具,你可以喂它们。如果这意味着产卵的服务器,就这样吧。也许如果你的错误就足以将导致重构,这将使它可检验的另一种方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top