9

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.

編集:質問を簡単にするために、最初に投稿した2つのエラーのうちの1つを削除しました。

4

1 に答える 1

4

それは(RequestHandlerを作成した後)私にとってはうまくいきました:

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

shutdownそれ自体を呼び出さないのは、socketserver のバグである可能性がありserver_closeます。

于 2011-10-26T04:51:59.323 に答える