Python:单元测试基于套接字的代码?

标签 python sockets testing gevent

我正在编写一个 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,通过keyfilecertfile构造函数的参数,它将用 SSLObject 包装每个套接字在将其传递给您的处理程序之前。

如果您不使用 StreamServer并且您的服务器基于 Greenlet那么确实spawning这是你应该做的。不要忘记 kill它在测试用例的末尾。

gevent 中启动服务器和生成greenlet 是快速操作。 ,比创建新线程或进程快得多,您可以轻松地为每个测试用例创建新服务器。只是不要忘记在您不再需要服务器时立即进行清理。

我相信没有必要模拟任何 gevent API,使用它会容易得多,因为服务器和客户端可以愉快地生活在同一个进程中。

关于Python:单元测试基于套接字的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047897/

相关文章:

python - 有没有办法使用 argparse 模块输入以 '-' 符号开头的字符串作为命令行参数? (不使用标志)

python - 如何创建带有复选框的动态 kivy 应用程序?

ios - 我如何测试游戏中心

java - 我如何测试 gwtp addToPopupSlot?

c# - 使用 HttpRequestMessage 测试安全 Web API

python - VS代码: How to debug Flask app that uses Connexion?

Python 从 ZigBee 帧读取零

python - 使用 asyncore 读取套接字缓冲区

c# - 在C#中连接到Udp服务器的客户端列表

c# - 如何在 UWP 应用程序中为 StreamSocket.UpgradeToSslAsync 设置超时?