如何为 Python socketserver 请求处理程序编写单元测试?

Posted

技术标签:

【中文标题】如何为 Python socketserver 请求处理程序编写单元测试?【英文标题】:How to write unit test for Python socketserver request handler? 【发布时间】:2011-12-04 23:27:48 【问题描述】:

如何为 socketserver 请求处理程序编写单元测试?我尝试使用以下代码但遇到了问题:

import socketserver, unittest, threading

class TestServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    allow_reuse_address = True

class MyRequestHandlerTest(unittest.TestCase):
    def setUp(self):
        self.server = TestServer((HOST, PORT), MyRequestHandler)
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.client = socket.create_connection((HOST, PORT))
        #self.server_thread.setDaemon(True)
        self.server_thread.start()

    def tearDown(self):
        self.client.close()
        self.server.shutdown()

如果我尝试使用多个测试功能,像这样

    def test_foo(self):
        self.client.send(b'foo\n')
        result = self.client.recv(1024)
        self.assertEqual(b'FOO', result)

    def test_bar(self):
        self.client.send(b'bar\n')
        result = self.client.recv(1024)
        self.assertEqual(b'BAR', result)

我得到了错误

socket.error: [Errno 98] Address already in use

在线self.server = ...,尽管我指示测试服务器到allow_reuse_address

编辑:删除了我最初发布的两个错误之一,以简化问题。

【问题讨论】:

您是否已经在该端口上运行了另一台服务器? 【参考方案1】:

它对我有用(在创建 RequestHandler 之后):

def tearDown(self): 
    self.client.close() 
    self.server.shutdown()
    self.server.server_close()

这可能是 socketserver shutdown 中的一个错误,它不会调用 server_close 本身。

【讨论】:

以上是关于如何为 Python socketserver 请求处理程序编写单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何为python安装子进程模块?

如何为python 3.6安装wxPython phoenix

如何为网站创建通知?

如何为特定网络接口创建传出套接字?

如何为“其他 - 请指定”制作单选按钮?

无法使用 ktrain 模型预测前端流光,请提供有关如何为预测功能提供输入的建议