How to test Python 3.4 asyncio code?

前端 未结 10 1288
遇见更好的自我
遇见更好的自我 2020-12-02 05:38

What\'s the best way to write unit tests for code using the Python 3.4 asyncio library? Assume I want to test a TCP client (SocketConnection):

10条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-02 06:08

    pylover answer is correct and is something that should be added to unittest IMO.

    I would add in a slight change to support nested async tests:

    class TestCaseBase(unittest.TestCase):
        # noinspection PyPep8Naming
        def __init__(self, methodName='runTest', loop=None):
            self.loop = loop or asyncio.get_event_loop()
            self._function_cache = {}
            super(BasicRequests, self).__init__(methodName=methodName)
    
        def coroutine_function_decorator(self, func):
            def wrapper(*args, **kw):
                # Is the io loop is already running? (i.e. nested async tests)
                if self.loop.is_running():
                    t = func(*args, **kw)
                else:
                    # Nope, we are the first
                    t = self.loop.run_until_complete(func(*args, **kw))
                return t
    
            return wrapper
    
        def __getattribute__(self, item):
            attr = object.__getattribute__(self, item)
            if asyncio.iscoroutinefunction(attr):
                if item not in self._function_cache:
                    self._function_cache[item] = self.coroutine_function_decorator(attr)
                return self._function_cache[item]
            return attr
    

提交回复
热议问题