public inbox for [email protected]
help / color / mirror / Atom feed[pgAdmin][Patch] - Feature Test failures fix
2+ messages / 2 participants
[nested] [flat]
* [pgAdmin][Patch] - Feature Test failures fix
@ 2021-05-26 16:53 Yogesh Mahajan <[email protected]>
2021-05-27 05:32 ` Re: [pgAdmin][Patch] - Feature Test failures fix Akshay Joshi <[email protected]>
0 siblings, 1 reply; 2+ messages in thread
From: Yogesh Mahajan @ 2021-05-26 16:53 UTC (permalink / raw)
To: pgadmin-hackers
Hi,
Please find the patch which modifies the way to execute feature tests in
parallel.(Selenoid test).
To run selenoid tests, pgadmin should be configured in SERVER_MODE.
Thanks,
Yogesh Mahajan
EnterpriseDB
Attachments:
[application/octet-stream] Feature_Test_Fix_Run_In_Server_Mode_Only_v1.patch (25.5K, 3-Feature_Test_Fix_Run_In_Server_Mode_Only_v1.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py
index 6ca88c5d0..a4544daf1 100644
--- a/web/pgadmin/feature_tests/browser_tool_bar_test.py
+++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py
@@ -88,6 +88,7 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
BrowserToolBarLocators.view_table_data_button_css),
(By.CSS_SELECTOR, BrowserToolBarLocators.view_data_panel_css)),
'View/Edit Data tab did not open after clicking View/Edit button.')
+ self.page.close_query_tool(prompt=False)
def test_filtered_rows_tool_button(self):
self.assertTrue(self.page.retry_click(
@@ -96,3 +97,4 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
(By.CSS_SELECTOR, BrowserToolBarLocators.filter_alertify_box_css)),
'Filter dialogue did not open on clicking filter button.')
self.page.click_modal('Cancel')
+ self.page.close_query_tool(prompt=False)
diff --git a/web/pgadmin/feature_tests/file_manager_test.py b/web/pgadmin/feature_tests/file_manager_test.py
index 832c96b0e..ac9f25c9f 100644
--- a/web/pgadmin/feature_tests/file_manager_test.py
+++ b/web/pgadmin/feature_tests/file_manager_test.py
@@ -41,7 +41,10 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
self.wait = WebDriverWait(self.page.driver, 10)
filename = self.server_information['type'] + \
str(self.server_information['server_version'])
- self.XSS_FILE = '/tmp/<img src=x ' + filename + '=alert("1")>.sql'
+ if self.parallel_ui_tests:
+ self.XSS_FILE = '/<img src=x ' + filename + '=alert("1")>.sql'
+ else:
+ self.XSS_FILE = '/tmp/<img src=x ' + filename + '=alert("1")>.sql'
# Remove any previous file
if os.path.isfile(self.XSS_FILE):
os.remove(self.XSS_FILE)
@@ -92,21 +95,14 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
self.page.fill_input_by_css_selector(
QueryToolLocators.input_file_path_css,
"/tmp", key_after_input=Keys.RETURN)
+ time.sleep(2)
+
+ self.wait.until(EC.visibility_of_element_located(
+ (By.CSS_SELECTOR, QueryToolLocators.select_file_content_css)))
+
+ table = self.page.driver.find_element_by_css_selector(
+ QueryToolLocators.select_file_content_css)
- if self.page.driver.capabilities['browserName'] == 'firefox':
- table = self.page.wait_for_element_to_reload(
- lambda driver: driver.find_element_by_css_selector(
- QueryToolLocators.select_file_content_css)
- )
- else:
- self.wait.until(EC.visibility_of_element_located(
- (By.CSS_SELECTOR, QueryToolLocators.select_file_content_css)))
- self.wait.until(lambda element:
- self.page.driver.find_element_by_css_selector(
- '[name=home]').is_enabled())
-
- table = self.page.driver.find_element_by_css_selector(
- QueryToolLocators.select_file_content_css)
retry_count = 0
while retry_count < 5:
try:
diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py
index 0cedcf6f9..d191019ca 100644
--- a/web/pgadmin/feature_tests/table_ddl_feature_test.py
+++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py
@@ -46,8 +46,8 @@ class TableDdlFeatureTest(BaseFeatureTest):
# Wait till data is displayed in SQL Tab
self.assertTrue(self.page.check_if_element_exist_by_xpath(
"//*[contains(@class,'CodeMirror-lines') and "
- "contains(.,'CREATE TABLE public.%s')]" % self.test_table_name,
- 10), "No data displayed in SQL tab")
+ "contains(.,'CREATE TABLE IF NOT EXISTS public.%s')]"
+ % self.test_table_name, 10), "No data displayed in SQL tab")
def after(self):
self.page.remove_server(self.server)
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index 2896a85b5..d61a97b49 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -148,6 +148,9 @@ class BaseTestGenerator(unittest.TestCase):
def setDriver(self, driver):
self.driver = driver
+ def setParallelUI_tests(self, parallel_ui_tests):
+ self.parallel_ui_tests = parallel_ui_tests
+
def setServerInformation(self, server_information):
self.server_information = server_information
diff --git a/web/regression/README b/web/regression/README
index c52ef9478..a7e4230a2 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -142,7 +142,8 @@ Python Tests:
'pgadmin4/web/pgadmin/utils/test.py' file.
- To run Feature Tests in parallel using selenoid(grid + docker), selenoid
- need to be installed. Steps to install selenoid -
+ need to be installed nad should be run only with SERVER_MODE=True.
+ Steps to install selenoid -
- Install & Start docker
$yum -y install docker docker-registry
diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py
index 4cdcfe287..acecc05ab 100644
--- a/web/regression/feature_utils/base_feature_test.py
+++ b/web/regression/feature_utils/base_feature_test.py
@@ -27,7 +27,7 @@ class BaseFeatureTest(BaseTestGenerator):
def setUp(self):
self.server = deepcopy(self.server)
self.server['name'] += ' Feature Tests'
- if app_config.SERVER_MODE:
+ if app_config.SERVER_MODE and not self.parallel_ui_tests:
self.skipTest(
"Currently, config is set to start pgadmin in server mode. "
"This test doesn't know username and password so doesn't work "
@@ -36,6 +36,8 @@ class BaseFeatureTest(BaseTestGenerator):
self.page = PgadminPage(self.driver, app_config)
try:
+ if self.parallel_ui_tests:
+ self.page.login_to_app(self.server['login_details'])
test_utils.reset_layout_db()
self.page.driver.switch_to.default_content()
self.page.wait_for_app()
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 726033470..8778cf0b9 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -37,6 +37,18 @@ class PgadminPage:
self.timeout = 30
self.app_start_timeout = 90
+ def login_to_app(self, user_detail):
+ if not (self.check_if_element_exist_by_xpath(
+ '//a[@id="navbar-user"]', 1)):
+ user_edt_box_el = self.driver.find_element_by_name('email')
+ user_edt_box_el.send_keys(user_detail['login_username'])
+ password_edt_box_el = self.driver.find_element_by_name('password')
+ password_edt_box_el.send_keys(user_detail['login_password'])
+ submit_btn = self.driver.find_element_by_xpath(
+ '//button[@value="Login"]')
+ submit_btn.click()
+ self.wait_for_spinner_to_disappear()
+
def reset_layout(self):
attempt = 0
while attempt < 4:
@@ -57,7 +69,15 @@ class PgadminPage:
self.wait_for_reloading_indicator_to_disappear()
def refresh_page(self):
- self.driver.refresh()
+ try:
+ self.driver.refresh()
+ # wait until alert is present
+ WebDriverWait(self.driver, 1).until(EC.alert_is_present())
+
+ # switch to alert and accept it
+ self.driver.switch_to.alert.accept()
+ except TimeoutException:
+ pass
def click_modal(self, button_text):
time.sleep(0.5)
@@ -300,6 +320,7 @@ class PgadminPage:
delete_menu_item = self.find_by_partial_link_text("Remove Server")
self.click_element(delete_menu_item)
self.click_modal('Yes')
+ time.sleep(1)
def select_tree_item(self, tree_item_text):
item = self.find_by_xpath(
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 4de3ad9d1..be4cd273b 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -17,6 +17,7 @@ import psycopg2
import sqlite3
import shutil
from functools import partial
+import random
from selenium.webdriver.support.wait import WebDriverWait
from testtools.testcase import clone_test_with_new_id
@@ -1400,7 +1401,7 @@ def get_parallel_sequential_module_list(module_list):
sequential_tests_file = [
'pgadmin.feature_tests.pg_utilities_backup_restore_test',
'pgadmin.feature_tests.pg_utilities_maintenance_test',
- 'pgadmin.feature_tests.keyboard_shortcut_test']
+ ]
# list of tests can be executed in parallel
parallel_tests = list(module_list)
@@ -1704,3 +1705,28 @@ def create_user_wise_test_client(user):
return wrapper
return multi_user_decorator
+
+
+def create_users_for_parallel_tests(tester):
+ """
+ Function creates user using /user api
+ @param tester: test client
+ @return: uer details dict
+ """
+ login_username = 'ui_test_user' + str(random.randint(1000, 9999)) +\
+ '@edb.com'
+ user_details = {'login_username': login_username,
+ 'login_password': 'adminedb'}
+ response = tester.post(
+ '/user_management/user/',
+ data=json.dumps(dict(username=user_details['login_username'],
+ email=user_details['login_username'],
+ newPassword=user_details['login_password'],
+ confirmPassword=user_details['login_password'],
+ active=True,
+ role="1"
+ )),
+ follow_redirects=True)
+ user_id = json.loads(response.data.decode('utf-8'))['id']
+ user_details['user_id'] = user_id
+ return user_details
diff --git a/web/regression/runtests.py b/web/regression/runtests.py
index 1142fb9cf..f59dacacb 100644
--- a/web/regression/runtests.py
+++ b/web/regression/runtests.py
@@ -151,7 +151,7 @@ scenarios.apply_scenario = test_utils.apply_scenario
def get_suite(module_list, test_server, test_app_client, server_information,
- test_db_name, driver_passed):
+ test_db_name, driver_passed, parallel_ui_test):
"""
This function add the tests to test suite and return modified test suite
variable.
@@ -164,6 +164,12 @@ def get_suite(module_list, test_server, test_app_client, server_information,
:type test_app_client: pgadmin app object
:return pgadmin_suite: test suite with test cases
:rtype: TestSuite
+ :param driver_passed: driver object to run selenium tests
+ :type driver_passed: webdriver object
+ :param parallel_ui_test: whether ui tests to be run in parallel
+ :type parallel_ui_test: boolan
+ :param test_db_name: database name
+ :type test_db_name: string
"""
modules = []
pgadmin_suite = unittest.TestSuite()
@@ -182,11 +188,11 @@ def get_suite(module_list, test_server, test_app_client, server_information,
obj.setTestClient(test_app_client)
obj.setTestServer(test_server)
obj.setDriver(driver_passed)
+ obj.setParallelUI_tests(parallel_ui_test)
obj.setServerInformation(server_information)
obj.setTestDatabaseName(test_db_name)
scenario = scenarios.generate_scenarios(obj)
pgadmin_suite.addTests(scenario)
-
return pgadmin_suite
@@ -450,12 +456,14 @@ class StreamToLogger(object):
pass
-def execute_test(test_module_list_passed, server_passed, driver_passed):
+def execute_test(test_module_list_passed, server_passed, driver_passed,
+ parallel_ui_test=False):
"""
Function executes actually test
- :param test_module_list_passed:
- :param server_passed:
- :param driver_passed:
+ :param test_module_list_passed: test modules
+ :param server_passed: serve details
+ :param driver_passed: webdriver object
+ :param parallel_ui_test: parallel ui tests
:return:
"""
try:
@@ -493,11 +501,17 @@ def execute_test(test_module_list_passed, server_passed, driver_passed):
test_utils.configure_preferences(
default_binary_path=server_passed['default_binary_paths'])
+ # Create user to run selenoid tests in parallel
+ if parallel_ui_test:
+ server_passed['login_details'] = \
+ test_utils.create_users_for_parallel_tests(test_client)
+
# Get unit test suit
suite = get_suite(test_module_list_passed,
server_passed,
test_client,
- server_information, test_db_name, driver_passed)
+ server_information, test_db_name, driver_passed,
+ parallel_ui_test=parallel_ui_test)
# Run unit test suit created
tests = unittest.TextTestRunner(stream=sys.stderr,
@@ -570,12 +584,11 @@ def run_parallel_tests(url_client, servers_details, parallel_tests_lists,
:param max_thread_count:
"""
driver_object = None
-
- # Thread list
- threads_list = []
- # Create thread for each server
- for ser in servers_details:
- try:
+ try:
+ # Thread list
+ threads_list = []
+ # Create thread for each server
+ for ser in servers_details:
while True:
# If active thread count <= max_thread_count, add new thread
if threading.activeCount() <= max_thread_count:
@@ -594,33 +607,33 @@ def run_parallel_tests(url_client, servers_details, parallel_tests_lists,
# Start thread
t = threading.Thread(target=execute_test, name=thread_name,
args=(parallel_tests_lists, ser,
- driver_object))
+ driver_object, True))
threads_list.append(t)
t.start()
- time.sleep(3)
+ time.sleep(10)
break
# else sleep for 10 seconds
else:
time.sleep(10)
- # Start threads in parallel
- for t in threads_list:
- t.join()
+ # Start threads in parallel
+ for t in threads_list:
+ t.join()
- except Exception as exc:
- # Print exception stack trace
- traceback.print_exc(file=sys.stderr)
- print('Exception before starting tests for ' + ser['name'],
- file=sys.stderr)
- print(str(exc), file=sys.stderr)
+ except Exception as exc:
+ # Print exception stack trace
+ traceback.print_exc(file=sys.stderr)
+ print('Exception before starting tests for ' + ser['name'],
+ file=sys.stderr)
+ print(str(exc), file=sys.stderr)
- # Mark failure as true
- global failure
- failure = True
+ # Mark failure as true
+ global failure
+ failure = True
- # Clean driver object created
- if driver_object is not None:
- driver_object.quit()
+ # Clean driver object created
+ if driver_object is not None:
+ driver_object.quit()
def run_sequential_tests(url_client, servers_details, sequential_tests_lists,
@@ -654,7 +667,7 @@ def run_sequential_tests(url_client, servers_details, sequential_tests_lists,
t = threading.Thread(target=execute_test,
name=thread_name,
args=(sequential_tests_lists, ser,
- driver_object))
+ driver_object, True))
t.start()
t.join()
except Exception as exc:
@@ -779,105 +792,114 @@ if __name__ == '__main__':
if args['pkg'] is not None:
node_name = args['pkg'].split('.')[-1]
+ is_parallel_ui_tests = test_utils.is_parallel_ui_tests(args)
# Check if feature tests included & parallel tests switch passed
- if test_utils.is_feature_test_included(args) and \
- test_utils.is_parallel_ui_tests(args):
- try:
- # Get selenium config dict
- selenoid_config = test_setup.config_data['selenoid_config']
-
- # Set DEFAULT_SERVER value
- default_server = selenoid_config['pgAdmin_default_server']
- os.environ["PGADMIN_CONFIG_DEFAULT_SERVER"] = str(default_server)
- config.DEFAULT_SERVER = str(default_server)
-
- # Get hub url
- hub_url = selenoid_config['selenoid_url']
-
- # Get selenium grid status & list of available browser out passed
- selenium_grid_status, list_of_browsers \
- = test_utils.get_selenium_grid_status_and_browser_list(hub_url,
- args)
-
- # Execute tests if selenium-grid is up
- if selenium_grid_status and len(list_of_browsers) > 0:
- app_starter_local = None
- # run across browsers
- for browser_info in list_of_browsers:
- try:
- # browser info
- browser_name, browser_version = \
- test_utils.get_browser_details(browser_info,
- hub_url)
-
- # test lists can be executed in parallel & sequentially
- parallel_tests, sequential_tests = \
- test_utils.get_parallel_sequential_module_list(
- test_module_list)
-
- # Print test summary
- test_utils.print_test_summary(
- test_module_list, parallel_tests, sequential_tests,
- browser_name, browser_version)
-
- # Create app form source code
- app_starter_local = AppStarter(None, config)
- client_url = app_starter_local.start_app()
-
- if config.DEBUG:
- print('pgAdmin is launched with DEBUG=True, '
- 'hence sleeping for 50 seconds.',
- file=sys.stderr)
- time.sleep(50)
-
- # Running Parallel tests
- if len(parallel_tests) > 0:
- parallel_sessions = \
- int(selenoid_config['max_parallel_sessions'])
-
- run_parallel_tests(
- client_url, servers_info, parallel_tests,
- browser_name, browser_version,
- parallel_sessions)
-
- # Sequential Tests
- if len(sequential_tests) > 0:
- run_sequential_tests(
- client_url, servers_info, sequential_tests,
+ if test_utils.is_feature_test_included(args) and is_parallel_ui_tests:
+ if config.SERVER_MODE:
+ try:
+ # Get selenium config dict
+ selenoid_config = test_setup.config_data['selenoid_config']
+
+ # Set DEFAULT_SERVER value
+ default_server = selenoid_config['pgAdmin_default_server']
+ os.environ["PGADMIN_CONFIG_DEFAULT_SERVER"] = str(
+ default_server)
+ config.DEFAULT_SERVER = str(default_server)
+
+ # Get hub url
+ hub_url = selenoid_config['selenoid_url']
+
+ # Get selenium grid status & list of available browser
+ # out of passed
+ selenium_grid_status, list_of_browsers = test_utils.\
+ get_selenium_grid_status_and_browser_list(hub_url, args)
+
+ # Execute tests if selenium-grid is up
+ if selenium_grid_status and len(list_of_browsers) > 0:
+ app_starter_local = None
+ # run across browsers
+ for browser_info in list_of_browsers:
+ try:
+ # browser info
+ browser_name, browser_version = \
+ test_utils.get_browser_details(browser_info,
+ hub_url)
+
+ # test lists can be executed in
+ # parallel & sequentially
+ parallel_tests, sequential_tests = \
+ test_utils.get_parallel_sequential_module_list(
+ test_module_list)
+
+ # Print test summary
+ test_utils.print_test_summary(
+ test_module_list, parallel_tests,
+ sequential_tests,
browser_name, browser_version)
- # Clean up environment
- if app_starter_local:
- app_starter_local.stop_app()
-
- # Pause before printing result in order
- # not to mix output
- time.sleep(5)
-
- # Print note for completion of execution in a browser.
- print(
- "\n============= Test execution with {0} is "
- "completed.=============".format(browser_name),
- file=sys.stderr)
- print_test_results()
-
- except SystemExit:
- if app_starter_local:
- app_starter_local.stop_app()
- if handle_cleanup:
- handle_cleanup()
- raise
- else:
- print(
- "\n============= Either Selenium Grid is NOT up OR"
- " browser list is 0 =============", file=sys.stderr)
+ # Create app form source code
+ app_starter_local = AppStarter(None, config)
+ client_url = app_starter_local.start_app()
+
+ if config.DEBUG:
+ print('pgAdmin is launched with DEBUG=True, '
+ 'hence sleeping for 50 seconds.',
+ file=sys.stderr)
+ time.sleep(50)
+
+ # Running Parallel tests
+ if len(parallel_tests) > 0:
+ parallel_sessions = \
+ int(selenoid_config[
+ 'max_parallel_sessions'])
+
+ run_parallel_tests(
+ client_url, servers_info, parallel_tests,
+ browser_name, browser_version,
+ parallel_sessions)
+
+ # Sequential Tests
+ if len(sequential_tests) > 0:
+ run_sequential_tests(
+ client_url, servers_info, sequential_tests,
+ browser_name, browser_version)
+
+ # Clean up environment
+ if app_starter_local:
+ app_starter_local.stop_app()
+
+ # Pause before printing result in order
+ # not to mix output
+ time.sleep(5)
+
+ print(
+ "\n============= Test execution with {0} is "
+ "completed.=============".format(browser_name),
+ file=sys.stderr)
+ print_test_results()
+
+ except SystemExit:
+ if app_starter_local:
+ app_starter_local.stop_app()
+ if handle_cleanup:
+ handle_cleanup()
+ raise
+ else:
+ print(
+ "\n============= Either Selenium Grid is NOT up OR"
+ " browser list is 0 =============", file=sys.stderr)
+ failure = True
+ except Exception as exc:
+ # Print exception stack trace
+ traceback.print_exc(file=sys.stderr)
+ print(str(exc))
failure = True
- except Exception as exc:
- # Print exception stack trace
- traceback.print_exc(file=sys.stderr)
- print(str(exc))
+ del os.environ["PGADMIN_CONFIG_DEFAULT_SERVER"]
+ else:
+ print(
+ "\n============= Please Turn on Server Mode to run selenoid "
+ "tests =============", file=sys.stderr)
failure = True
- del os.environ["PGADMIN_CONFIG_DEFAULT_SERVER"]
else:
try:
for server in servers_info:
^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: [pgAdmin][Patch] - Feature Test failures fix
2021-05-26 16:53 [pgAdmin][Patch] - Feature Test failures fix Yogesh Mahajan <[email protected]>
@ 2021-05-27 05:32 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 2+ messages in thread
From: Akshay Joshi @ 2021-05-27 05:32 UTC (permalink / raw)
To: Yogesh Mahajan <[email protected]>; +Cc: pgadmin-hackers
Thanks, the patch applied.
On Wed, May 26, 2021 at 10:23 PM Yogesh Mahajan <
[email protected]> wrote:
> Hi,
>
> Please find the patch which modifies the way to execute feature tests in
> parallel.(Selenoid test).
> To run selenoid tests, pgadmin should be configured in SERVER_MODE.
>
> Thanks,
> Yogesh Mahajan
> EnterpriseDB
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2021-05-27 05:32 UTC | newest]
Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2021-05-26 16:53 [pgAdmin][Patch] - Feature Test failures fix Yogesh Mahajan <[email protected]>
2021-05-27 05:32 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox