def tearDownClass(cls):
        """Show a final printout of remaining running tasks and threads upon
        completion of all tests in this class.

        Note that these are not meant to result in test failures. This is only
        executed after all the tests in a test class are done.
        """

        print(f"Tearing down {cls.__name__}")

        running_tasks = []

        try:
            loop = asyncio.get_event_loop()
            print(f"  Loop still running: {loop}")
            print("  Remaining tasks:")
            for task in asyncio.all_tasks(loop):
                running_tasks.append(task)
                print("    " + str(task))
                task.print_stack()

        except Exception as e:
            print(f"  No running loop? {e}")

        print("  Remaining non-main threads:")
        non_main_threads = [
            thread
            for thread in threading.enumerate()
            if thread != threading.main_thread()
        ]
        for thread in non_main_threads:
            print("    " + str(thread))

        super().tearDownClass()
Show a final printout of remaining running tasks and threads upon
        completion of all tests in this class.

        Note that these are not meant to result in test failures. This is only
        executed after all the tests in a test class are done.
        
tests/test.py