У нас есть unittest, который настроен следующим образом.
class ServerWrapper(object):
"""
A test helper which manages an instance of a RPC server.
Can be used as a context manager, or using start() and stop() methods.
"""
def __init__(self, port, service):
self._service = service
self.address = ('localhost', port)
self._server = None
self._server_thread = None
self._running = False
def start(self):
self._server = RPCServer(self._service, self.address)
self._server_thread = Thread(target=self._server.serve_forever, args=(0.05,))
self._server_thread.setDaemon(True)
self._server_thread.start()
self._running = True
return self
def stop(self):
if not self._running:
return
self._server.shutdown()
self._server_thread.join()
# hacks to force the server to properly shutdown;
# without this you get a socket already in use error
self._server.server_close()
del self._server
self._running = False
def __enter__(self):
return self.start()
def __exit__(self, exc_type, exc_val, exc_tb):
self.stop()
class RPCEndToEndTestCase(unittest.TestCase):
"""
End-to-end tests on RPC servers and proxies, confirming behaviour and performance is as
expected.
"""
def setUp(self):
# start the sever
self._server = ServerWrapper(65432, TestService(i=10)).start()
# a short poll interval makes timeouts happen faster, and allows for faster running
# consumer threads (when they rely on timeouts)
self._proxy = RPCProxy([self._server.address], poll_interval=0.1, timeout=1)
# type TestService
def tearDown(self):
# shutdown server
self._server.stop()
@staticmethod
def _report(message):
sys.stdout.write("\nE2E report: {}\n".format(message))
def test_basic(self):
self.assertEqual(11, self._proxy.inc())
При вызове модульного теста он отлично работает с python 2.7, но под python 3.7 он не проходит метод разрыва.
При расследовании мы увидели, что он продолжает зависать на методе server_close.wait ().
У кого-нибудь есть какие-нибудь советы?
Мы уже пытались установить
ThreadingMixIn.daemon_threads = True
, но безуспешно.