我正在编写一个 Python 客户端+服务器,它使用 gevent.socket
进行通信。有什么好的方法可以测试代码的套接字级别的操作(例如,验证带有无效证书的 SSL 连接是否会被拒绝)?还是仅仅spawn
一个真正的服务器最简单?
编辑:由于涉及复杂的交互,我认为“天真的”模拟不足以测试 SSL 组件。我错了吗?还是有更好的方法来测试 SSL 的东西?
最佳答案
您可以轻松启动服务器,然后在测试用例中访问它。该gevent的own test suite正是为了测试 gevent 的 built-in servers .
例如:
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那么确实spawning这是你应该做的。不要忘记 kill它在测试用例的末尾。
在gevent 中启动服务器和生成greenlet 是快速操作。 ,比创建新线程或进程快得多,您可以轻松地为每个测试用例创建新服务器。只是不要忘记在您不再需要服务器时立即进行清理。
我相信没有必要模拟任何 gevent API,使用它会容易得多,因为服务器和客户端可以愉快地生活在同一个进程中。
关于Python:单元测试基于套接字的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047897/