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

arg*_*per 5 python sockets unit-testing tcp socketserver

如何为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()
Run Code Online (Sandbox Code Playgroud)

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

    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)
Run Code Online (Sandbox Code Playgroud)

我收到了错误

socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

在线self.server = ...,即使我指示测试服务器allow_reuse_address.

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

Mar*_*nen 4

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

def tearDown(self): 
    self.client.close() 
    self.server.shutdown()
    self.server.server_close()
Run Code Online (Sandbox Code Playgroud)

这可能是套接字服务器中的一个错误shutdown,它不调用server_close自身。