diff --git a/django/contrib/admin/tests.py b/django/contrib/admin/tests.py index a8ece9d381..93191f6a0d 100644 --- a/django/contrib/admin/tests.py +++ b/django/contrib/admin/tests.py @@ -22,22 +22,18 @@ class AdminSeleniumWebDriverTestCase(StaticLiveServerCase): if not os.environ.get('DJANGO_SELENIUM_TESTS', False): raise SkipTest('Selenium tests not requested') try: - webdriver_class = import_by_path(cls.webdriver_class) - except ImportError as e: - raise SkipTest('Selenium webdriver "%s" not installed: %s' - % (cls.webdriver_class, str(e))) - super(AdminSeleniumWebDriverTestCase, cls).setUpClass() - try: - cls.selenium = webdriver_class() + cls.selenium = import_by_path(cls.webdriver_class)() except Exception as e: - raise SkipTest('Selenium webdriver "%s" not operational: %s' - % (cls.webdriver_class, str(e))) + raise SkipTest('Selenium webdriver "%s" not installed or not ' + 'operational: %s' % (cls.webdriver_class, str(e))) + # This has to be last to ensure that resources are cleaned up properly! + super(AdminSeleniumWebDriverTestCase, cls).setUpClass() @classmethod - def tearDownClass(cls): + def _tearDownClassInternal(cls): + super(AdminSeleniumWebDriverTestCase, cls)._tearDownClassInternal() if hasattr(cls, 'selenium'): cls.selenium.quit() - super(AdminSeleniumWebDriverTestCase, cls).tearDownClass() def wait_until(self, callback, timeout=10): """ diff --git a/django/test/testcases.py b/django/test/testcases.py index bc73496801..caff63039a 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -1125,12 +1125,15 @@ class LiveServerTestCase(TransactionTestCase): # Wait for the live server to be ready cls.server_thread.is_ready.wait() if cls.server_thread.error: + # Clean up behind ourselves, since tearDownClass won't get called in + # case of errors. + cls._tearDownClassInternal() raise cls.server_thread.error super(LiveServerTestCase, cls).setUpClass() @classmethod - def tearDownClass(cls): + def _tearDownClassInternal(cls): # There may not be a 'server_thread' attribute if setUpClass() for some # reasons has raised an exception. if hasattr(cls, 'server_thread'): @@ -1143,4 +1146,7 @@ class LiveServerTestCase(TransactionTestCase): and conn.settings_dict['NAME'] == ':memory:'): conn.allow_thread_sharing = False + @classmethod + def tearDownClass(cls): + cls._tearDownClassInternal() super(LiveServerTestCase, cls).tearDownClass()