class BaseTestAsync(unittest.TestCase): @classmethod def setUpClass(cls): cls.app = start_app() @classmethod def tearDownClass(cls): pass # cls.app.quit() # useless # stop_app() # NameError: name 'QGISAPP' is not defined # cls.app.exitQgis() # crash when run unittest (all module) # del cls.app def setUp(self): if isinstance(super(), BaseTestAsync) and hasattr( super(), self._testMethodName): self.skipTest("duplicated test") # self.loop = self.app self.loop = QEventLoop() self._output = list() self._idx = 0 self._lst_error = list() self.startTime = time.time() self._log_debug("Test start. ###################") def tearDown(self): self._stop_async() # useless ? self._log_debug("Test ended. ################### \n") self._log_info("%s: %.3fs" % (self._id(), time.time() - self.startTime)) def _add_output(self, output): self._output.append(output) def output(self, idx=None): if idx is None: idx = self._idx self._idx = min(idx + 1, len(self._output)) return self._output[idx] if idx < len(self._output) else None def _stop_async(self): self.loop.quit() self._log_debug("Stop Async. ###################") def _handle_error(self, e): pretty_print_error(e) self._stop_async() self._lst_error.append(e) # raise ErrorDuringTest(e) def _process_async(self): self.loop.processEvents() def _wait_async(self): t0 = time.time() self.loop.exec_() self._log_info("%s: wait_async end: %.3fs" % (self._id(), time.time() - t0)) if self._lst_error: raise AllErrorsDuringTest(self._lst_error) def _make_async_fun(self, fun): return AsyncFun(fun) def _log_error(self, *a, **kw): print(*a, file=sys.stderr, **kw) def _log_info(self, *a, **kw): log_truncate(*a, **kw) def _log_debug(self, *a, **kw): fn_name = "{}:".format(self._id()) # fn_name = sys._getframe(1).f_code.co_name log_truncate(fn_name, *a, **kw) def _id(self): return self._subtest.id() if self._subtest else self.id() def assertMultiInput(self, expected, lst_input, msg="multi input"): for i, actual in enumerate(lst_input): self.assertEqual(expected, actual, "{} [{}]".format(msg, i)) #unused def assertPairEqual(self, *a): pairs = [a[i:i + 2] for i in range(0, len(a), 2)] return self.assertEqual(*zip(*pairs))