From 5f26c4edd1d02ef722a0a0a32d1d2518b7ef0f17 Mon Sep 17 00:00:00 2001 From: Joao Pereira and Sarah McAlear Date: Thu, 2 Mar 2017 16:58:38 -0500 Subject: [PATCH 3/3] Improves screenshots and reduces test flakiness - rename screenshot files to add python version - put screenshots into separate pg version folders --- .../connect_to_server_feature_test.py | 4 +-- .../template_selection_feature_test.py | 4 +-- .../settings/templates/settings/settings.js | 8 +++-- web/regression/feature_utils/base_feature_test.py | 35 +++++++++++++++++++--- web/regression/feature_utils/pgadmin_page.py | 13 +++++++- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/web/pgadmin/feature_tests/connect_to_server_feature_test.py b/web/pgadmin/feature_tests/connect_to_server_feature_test.py index 00fada81..211385f8 100644 --- a/web/pgadmin/feature_tests/connect_to_server_feature_test.py +++ b/web/pgadmin/feature_tests/connect_to_server_feature_test.py @@ -19,9 +19,7 @@ class ConnectsToServerFeatureTest(BaseFeatureTest): Tests that a database connection can be created from the UI """ - def setUp(self): - super(ConnectsToServerFeatureTest, self).setUp() - + def before(self): connection = test_utils.get_db_connection(self.server['db'], self.server['username'], self.server['db_password'], diff --git a/web/pgadmin/feature_tests/template_selection_feature_test.py b/web/pgadmin/feature_tests/template_selection_feature_test.py index 56e2d59e..7b7c039f 100644 --- a/web/pgadmin/feature_tests/template_selection_feature_test.py +++ b/web/pgadmin/feature_tests/template_selection_feature_test.py @@ -5,9 +5,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest class TemplateSelectionFeatureTest(BaseFeatureTest): - def setUp(self): - super(TemplateSelectionFeatureTest, self).setUp() - + def before(self): connection = test_utils.get_db_connection(self.server['db'], self.server['username'], self.server['db_password'], diff --git a/web/pgadmin/settings/templates/settings/settings.js b/web/pgadmin/settings/templates/settings/settings.js index 7bc9b3fe..716ca885 100644 --- a/web/pgadmin/settings/templates/settings/settings.js +++ b/web/pgadmin/settings/templates/settings/settings.js @@ -23,12 +23,14 @@ define( // and reload the window show: function() { var obj = this; - alertify.confirm('{{ _('Reset layout') }}', - '{{ _('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.') }}', + alertify.confirm("{{ _('Reset layout') }}", + "{{ _('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.') }}", function() { + var reloadingIndicator = $('
'); + $('body').append(reloadingIndicator); // Delete the record from database as well, then only reload page $.ajax({ - url: '{{ url_for('settings.reset_layout') }}', + url: "{{ url_for('settings.reset_layout') }}", type: 'DELETE', async: false, success: function() { diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py index f0c0167f..34bf4f48 100644 --- a/web/regression/feature_utils/base_feature_test.py +++ b/web/regression/feature_utils/base_feature_test.py @@ -1,9 +1,12 @@ +import errno +import sys +import os + from datetime import datetime import config as app_config from pgadmin.utils.route import BaseTestGenerator from regression.feature_utils.pgadmin_page import PgadminPage -import os class BaseFeatureTest(BaseTestGenerator): @@ -20,6 +23,7 @@ class BaseFeatureTest(BaseTestGenerator): self.page.wait_for_spinner_to_disappear() self.page.reset_layout() self.page.wait_for_spinner_to_disappear() + self.before() except: self._screenshot() raise @@ -27,12 +31,15 @@ class BaseFeatureTest(BaseTestGenerator): def runTest(self): pass + def before(self): + pass + def after(self): pass def tearDown(self): - python2_failures = hasattr(self, "_resultForDoCleanups") and ( - self._resultForDoCleanups.errors or self._resultForDoCleanups.failures) + python2_failures = hasattr(self, "_resultForDoCleanups") and self.current_test_failed() + python3_failures = hasattr(self, '_outcome') and self.any_step_failed() if python2_failures or python3_failures: @@ -46,6 +53,26 @@ class BaseFeatureTest(BaseTestGenerator): return True return False + def current_test_failed(self): + all_failures = self._resultForDoCleanups.errors + self._resultForDoCleanups.failures + for failure in all_failures: + if failure[0] == self: + return True + return False + def _screenshot(self): + path = '{0}/../screenshots/{1}'.format(self.CURRENT_PATH, self.server["name"].replace(" ", "_")) + + try: + os.mkdir(path) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise + + date = datetime.now().strftime("%Y.%m.%d_%H.%M.%S") + python_version = sys.version.split(" ")[0] + self.page.driver.save_screenshot( - '{0}/../screenshots/{1}-{2}.png'.format(self.CURRENT_PATH, self.__class__.__name__, str(datetime.now()))) + '{0}/{1}-{2}-Python-{3}.png'.format(path, self.__class__.__name__, date, python_version)) diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index 8622690c..96c28210 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -22,9 +22,10 @@ class PgadminPage: self.click_element(self.find_by_partial_link_text("File")) self.find_by_partial_link_text("Reset Layout").click() self.click_modal_ok() + self.wait_for_reloading_indicator_to_disappear() def click_modal_ok(self): - time.sleep(0.1) + time.sleep(0.5) self.click_element(self.find_by_xpath("//button[contains(.,'OK')]")) def add_server(self, server_config): @@ -113,6 +114,16 @@ class PgadminPage: return self._wait_for("element to exist", element_if_it_exists) + def wait_for_reloading_indicator_to_disappear(self): + def reloading_indicator_has_disappeared(driver): + try: + driver.find_element_by_id("reloading-indicator") + return False + except NoSuchElementException: + return True + + self._wait_for("reloading indicator to disappear", reloading_indicator_has_disappeared) + def wait_for_spinner_to_disappear(self): def spinner_has_disappeared(driver): try: -- 2.11.0