Hi Dave,

PFA patch for modular API test cases.

Kindly, review the same and let me know for any modification.

-- 
*Thanks,*
*Navnath Gadakh*
*Software Engineer*
*Phone : + 91 9975389878*


*The Postgres Database Company*
diff --git a/web/config.py b/web/config.py
index ff7c1db..6fb01ca 100644
--- a/web/config.py
+++ b/web/config.py
@@ -28,7 +28,10 @@ APP_REVISION = 0
 
 # Application version suffix, e.g. 'beta1', 'dev'. Usually an empty string
 # for GA releases.
-APP_SUFFIX = 'beta2.1'
+APP_SUFFIX = 'beta2'
+
+# Root path for pgadmin
+APP_ROOT = os.path.dirname(os.path.abspath(__file__))
 
 # Copyright string for display in the app
 APP_COPYRIGHT = 'Copyright 2013 - 2016, The pgAdmin Development Team'
@@ -154,6 +157,10 @@ MAX_SESSION_IDLE_TIME = 60
 # User account and settings storage
 ##########################################################################
 
+# The schema version number for the configuration database
+# DO NOT CHANGE UNLESS YOU ARE A PGADMIN DEVELOPER!!
+SETTINGS_SCHEMA_VERSION = 13
+
 # The default path to the SQLite database used to store user accounts and
 # settings. This default places the file in the same directory as this
 # config file, but generates an absolute path for use througout the app.
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..aa01297
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,15 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseCreateTestCase(BaseTestGenerator):
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..4cb5092
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,93 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import json
+import uuid
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from regression.config import advance_config_data
+
+
+class DatabaseAddTestCase(BaseTestGenerator):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def setUp(self):
+        """
+        This function perform the two tasks
+         1. Login to test client
+         2. Add the test server
+
+        :return: None
+        """
+
+        utils.login_tester_account(self.tester)
+        # Add the server
+        utils.add_server(self.tester)
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        server_connect_response, server_group, server_id = \
+            utils.connect_server(self.tester)
+
+        if server_connect_response['data']['connected']:
+            data = {
+                "datacl": advance_config_data['test_add_database_data'][0]
+                ['test_privileges_acl'],
+                "datconnlimit": advance_config_data
+                ['test_add_database_data'][0]['test_conn_limit'],
+                "datowner": advance_config_data
+                ['test_add_database_data'][0]['test_owner'],
+                "deffuncacl": advance_config_data
+                ['test_add_database_data'][0]['test_fun_acl'],
+                "defseqacl": advance_config_data
+                ['test_add_database_data'][0]['test_seq_acl'],
+                "deftblacl": advance_config_data
+                ['test_add_database_data'][0]['test_tbl_acl'],
+                "deftypeacl": advance_config_data
+                ['test_add_database_data'][0]['test_type_acl'],
+                "encoding": advance_config_data
+                ['test_add_database_data'][0]['test_encoding'],
+                "name": str(uuid.uuid4())[1:8],
+                "privileges": advance_config_data
+                ['test_add_database_data'][0]['test_privileges'],
+                "securities": advance_config_data
+                ['test_add_database_data'][0]['test_securities'],
+                "variables": advance_config_data
+                ['test_add_database_data'][0]['test_variables']
+            }
+
+            db_response = self.tester.post(self.url + str(server_group) + "/"
+                                           + server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+            self.assertTrue(db_response.status_code, 200)
+            response_data = json.loads(db_response.data.decode())
+            utils.write_db_parent_id(response_data)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..f21905b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,70 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from regression.config import config_data
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(BaseTestGenerator):
+    """ This class will delete the database under last added server. """
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def setUp(self):
+        """
+        This function perform the three tasks
+         1. Login to test client
+         2. Add the test server
+         3. Connect to server
+
+        :return: None
+        """
+
+        utils.login_tester_account(self.tester)
+        # Firstly, add the server
+        utils.add_server(self.tester)
+        # Secondly, connect to server/database
+        utils.connect_server(self.tester)
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+        db_con = test_getnodes(node=self)
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete!!!")
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        response_data = json.loads(response.data.decode())
+        self.assertTrue(response_data['success'], 1)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..e07fbba
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,67 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from regression.config import config_data
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(BaseTestGenerator):
+    """
+    This class will fetch database added under last added server.
+    """
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def setUp(self):
+        """
+        This function perform the three tasks
+         1. Login to test client
+         2. Add the test server
+         3. Connect to server
+
+        :return: None
+        """
+
+        utils.login_tester_account(self.tester)
+        # Firstly, add the server
+        utils.add_server(self.tester)
+        # Secondly, connect to server/database
+        utils.connect_server(self.tester)
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+        if db_con["info"] == "Database connected.":
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+            self.assertEquals(response.status_code, 200)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..5d36400
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,76 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from regression.config import config_data, advance_config_data
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesUpdateTestCase(BaseTestGenerator):
+    """
+    This class will update the database under last added server.
+    """
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def setUp(self):
+        """
+        This function perform the three tasks
+         1. Login to test client
+         2. Add the test server
+         3. Connect to server
+
+        :return: None
+        """
+
+        utils.login_tester_account(self.tester)
+        # Firstly, add the server
+        utils.add_server(self.tester)
+        # Secondly, connect to server/database
+        utils.connect_server(self.tester)
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        test_getnodes(node=self)
+        srv_grp = config_data['test_server_group']
+
+        data = {
+            "comments": advance_config_data["test_db_update_data"][0]
+            ["test_comment"],
+            "id": db_id
+        }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+        self.assertEquals(put_response.status_code, 200)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
+
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..55a3a17 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..3592cf2 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -9,45 +9,47 @@
 
 import json
 
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 
 
-class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
-
-    priority = 4
+class ServersAddTestCase(BaseTestGenerator):
+    """ This class will add the servers under default server group. """
 
     scenarios = [
         # Fetch the default url for server object
         ('Default Server Node url', dict(url='/browser/server/obj/'))
     ]
 
-    def runTest(self):
+    def setUp(self):
         """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
+        This function login the test account before running the logout
+        test case
         """
 
-        srv_grp = config_data['test_server_group']
-
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "comment": "",
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        utils.login_tester_account(self.tester)
 
-            url = self.url + str(srv_grp) + "/"
+    def runTest(self):
+        """ This function will add the server under default server group."""
 
-            response = self.tester.post(url, data=json.dumps(data),
+        server_group, config_data, pickle_id_dict = utils.get_config_data()
+        for server_data in config_data:
+            url = "{0}{1}/".format(self.url, server_group)
+            response = self.tester.post(url, data=json.dumps(server_data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+
+            response_data = json.loads(response.data.decode())
+            utils.write_parent_id(response_data, pickle_id_dict)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..1e9a686 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -9,49 +9,56 @@
 
 import json
 
-from pgadmin.browser.tests.test_login import LoginTestCase
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(BaseTestGenerator):
+    """ This class will delete the last server present under tree node."""
 
     scenarios = [
         # Fetching the default url for server node
         ('Default Server Node url', dict(url='/browser/server/obj/'))
     ]
 
-    def runTest(self):
+    def setUp(self):
         """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
+        This function perform the two tasks
+         1. Login to test client
+         2. Add the test server
+
+        :return: None
         """
 
-        srv_grp = config_data['test_server_group']
+        utils.login_tester_account(self.tester)
+        # Firstly, add the server
+        utils.add_server(self.tester)
 
-        for srv in config_data['test_server_credentials']:
+    def runTest(self):
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        srv_grp = config_data['test_server_group']
+        url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        response_data = json.loads(response.data.decode())
+        if len(response_data) == 0:
+            raise Exception("No server(s) to delete!!!")
 
-            url = self.url + str(srv_grp) + "/"
+        # Delete last server
+        server = response_data[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        response_data = json.loads(response.data.decode())
+        self.assertTrue(response_data['success'], 1)
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        :return: None
+        """
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..abf49a3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,43 +7,53 @@
 #
 # ##########################################################################
 
-import json
-
-from pgadmin.browser.tests.test_login import LoginTestCase
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersGetTestCase(LoginTestCase):
+class ServersGetTestCase(BaseTestGenerator):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
-    priority = 5
-
     scenarios = [
         # Fetch the default url for server node
         ('Default Server Node url', dict(url='/browser/server/obj/'))
     ]
 
-    def runTest(self):
+    def setUp(self):
         """
-        This function will get all available servers present under
-        object browser.
+        This function perform the two tasks
+         1. Login to test client
+         2. Add the test server
+
+        :return: None
         """
 
+        utils.login_tester_account(self.tester)
+        utils.add_server(self.tester)
+
+    def runTest(self):
+        """ This function will fetch the added servers to object browser. """
+
+        all_id = get_ids()
+        server_ids = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+        for server_id in server_ids:
+            url = "{0}{1}/{2}".format(self.url, srv_grp, server_id)
+            response = self.tester.get(url, content_type='html/json')
+            self.assertEquals(response.status_code, 200)
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..e2cd329 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -9,57 +9,66 @@
 
 import json
 
-from pgadmin.browser.tests.test_login import LoginTestCase
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 from regression.config import config_data
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-
-    priority = 6
+class ServerUpdateTestCase(BaseTestGenerator):
+    """ This class will update server's comment field. """
 
     scenarios = [
         # Fetching the default url for server node
         ('Default Server Node url', dict(url='/browser/server/obj/'))
     ]
 
-    def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
+    def setUp(self):
         """
+        This function perform the four tasks
+         1. Login to test client
+         2. Add the test server
+         3. Get the server
+         4. Connect to server
 
-        srv_grp = config_data['test_server_group']
+        :return: None
+        """
 
-        for srv in config_data['test_server_credentials']:
+        utils.login_tester_account(self.tester)
+        # Firstly, add the server
+        utils.add_server(self.tester)
+        # Get the server
+        utils.get_server(self.tester)
+        # Connect to server
+        self.server_connect, self.server_group, self.server_id = \
+            utils.connect_server(self.tester)
+        if len(self.server_connect) == 0:
+            raise Exception("No Server(s) connected to update!!!")
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+    def runTest(self):
+        """ This function will update the server's comment field. """
 
-            url = self.url + str(srv_grp) + "/"
+        data = {
+            "comment":
+                config_data['test_server_update_data']['test_comment'],
+            "id": self.server_id
+        }
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        put_response = self.tester.put(
+            self.url + str(self.server_group) + '/' +
+            str(self.server_id), data=json.dumps(data),
+            content_type='html/json')
+        self.assertEquals(put_response.status_code, 200)
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        response_data = json.loads(put_response.data.decode())
+        self.assertTrue(response_data['success'], 1)
 
-            for server in respdata:
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        :return: None
+        """
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        utils.delete_parent_id_file()
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/server_groups/tests/__init__.py b/web/pgadmin/browser/server_groups/tests/__init__.py
index 9fabed9..7fdd5c7 100644
--- a/web/pgadmin/browser/server_groups/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class SGGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In SGGenerateTestCase...")
+        return
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_add.py b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
index e70bb65..07bbe96 100644
--- a/web/pgadmin/browser/server_groups/tests/test_sg_add.py
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
@@ -9,28 +9,40 @@
 
 import json
 
-from pgadmin.browser.tests.test_login import LoginTestCase
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 from regression.config import config_data
 
 
-class SgNodeTestCase(LoginTestCase):
+class SgNodeTestCase(BaseTestGenerator):
     """
      This class will check available server groups in pgAdmin.
     """
 
-    priority = 1
-
     scenarios = [
         # Fetching the default url for server group node
         ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
     ]
 
+    def setUp(self):
+        """
+        This function login the test account before running the logout
+        test case
+        """
+
+        utils.login_tester_account(self.tester)
+
     def runTest(self):
         """This function will check available server groups."""
 
-        i = config_data['test_server_group']
-
-        response = self.tester.get(self.url + str(i), content_type='html/json')
+        server_group_id = config_data['test_server_group']
+        response = self.tester.get(self.url + str(server_group_id),
+                                   content_type='html/json')
         self.assertTrue(response.status_code, 200)
-        respdata = json.loads(response.data)
-        self.assertTrue(respdata['id'], i)
+        response_data = json.loads(response.data.decode('utf8'))
+        self.assertTrue(response_data['id'], server_group_id)
+
+    def tearDown(self):
+        """This function logout the test account """
+
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..3fab6fe 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class BrowserGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
\ No newline at end of file
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..8b47e25 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -9,19 +9,18 @@
 
 import uuid
 
-from pgadmin.browser.tests.test_login import LoginTestCase
+from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
+from regression import test_utils as utils
 
 
-class ChangePasswordTestCase(LoginTestCase):
+class ChangePasswordTestCase(BaseTestGenerator):
     """
     This class validates the change password functionality
     by defining change password scenarios; where dict of
     parameters describes the scenario appended by test name.
     """
 
-    priority = 2
-
     scenarios = [
         # This testcase validates invalid confirmation password
         ('TestCase for Validating Incorrect_New_Password', dict(
@@ -48,8 +47,7 @@ class ChangePasswordTestCase(LoginTestCase):
             new_password='', new_password_confirm='',
             respdata='Password not provided')),
 
-        # This testcase validates if current entered password
-        # is incorrect
+        # This testcase validates if current entered password is incorrect
         ('TestCase for Validating Incorrect_Current_Password', dict(
             password=str(uuid.uuid4())[4:8],
             new_password=(config_data['pgAdmin4_login_credentials']
@@ -70,6 +68,7 @@ class ChangePasswordTestCase(LoginTestCase):
                 ['test_new_password']),
             respdata='You successfully changed your password.')),
         ('Reassigning_Password', dict(
+            test_case='reassigning_password',
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_new_password']),
             new_password=(config_data['pgAdmin4_login_credentials']
@@ -81,14 +80,44 @@ class ChangePasswordTestCase(LoginTestCase):
 
     ]
 
+    def setUp(self):
+        """
+        This function login the test account before running the logout
+        test case
+        """
+
+        utils.login_tester_account(self.tester)
+
     def runTest(self):
         """This function will check change password functionality."""
 
+        # Check for 'test_case' exists in self For reassigning the password.
+        # Password gets change in change password test case.
+        if 'test_case' in dir(self):
+            email = \
+                config_data['pgAdmin4_login_credentials'][
+                    'test_login_username']
+            password = \
+                config_data['pgAdmin4_login_credentials'][
+                    'test_new_password']
+            response = self.tester.post('/login', data=dict(
+                email=email, password=password), follow_redirects=True)
+
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode())
+
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode())
+
+    def tearDown(self):
+        """
+        This function logout the test client
+
+        :return: None
+        """
+
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..8856700 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,9 +8,9 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
+from regression import test_utils as utils
 
 
 class LoginTestCase(BaseTestGenerator):
@@ -20,8 +20,6 @@ class LoginTestCase(BaseTestGenerator):
     describe the scenario appended by test name.
     """
 
-    priority = 0
-
     scenarios = [
         # This test case validates the invalid/incorrect password
         ('TestCase for Checking Invalid_Password', dict(
@@ -67,13 +65,28 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
+    def setUp(self):
+        pass
+
     def runTest(self):
         """This function checks login functionality."""
 
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
+
+    def tearDown(self):
+        """
+        This function deletes the 'parent_id.pkl' file which is created in
+        setup() function. Also this function logout the test client
+
+        :return: None
+        """
+
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..c2ccf94 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -7,38 +7,33 @@
 #
 # ##########################################################################
 
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
 
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
 
-class LogoutTest(LoginTestCase):
+
+class LogoutTest(BaseTestGenerator):
     """
     This class verifies the logout functionality; provided the user is already
     logged-in. Dictionary parameters define the scenario appended by test
     name.
     """
 
-    priority = 3
-
     scenarios = [
         # This test case validate the logout page
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
+    def setUp(self):
+        """
+        This function login the test account before running the logout
+        test case
+        """
+
+        utils.login_tester_account(self.tester)
+
     def runTest(self):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
-
-    def tearDown(self):
-        """
-        Defining tear down class, which will run after each test method execute.
-        Re-logging in as further modules require login.
-        """
-
-        self.tester.post('/login', data=dict(
-            email=(config_data['pgAdmin4_login_credentials']
-                   ['test_login_username']),
-            password=(config_data['pgAdmin4_login_credentials']
-                      ['test_login_password'])), follow_redirects=True)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..26dd80c 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -11,6 +11,7 @@ import uuid
 
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
+from regression import test_utils as utils
 
 
 class ResetPasswordTestCase(BaseTestGenerator):
@@ -19,7 +20,6 @@ class ResetPasswordTestCase(BaseTestGenerator):
     scenarios; Each dict parameter describe a scenario appended by
     test name.
     """
-    priority = 1
 
     scenarios = [
         # This test case validates the empty email field
@@ -37,12 +37,29 @@ class ResetPasswordTestCase(BaseTestGenerator):
             ['test_login_username'], respdata='pgAdmin 4'))
     ]
 
+    def setUp(self):
+        """
+        This function login the test account before running the logout
+        test case
+        """
+
+        utils.login_tester_account(self.tester)
+
     def runTest(self):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password', response.data.decode())
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode())
+
+    def tearDown(self):
+        """
+        This function logout the test client
+
+        :return: None
+        """
+
+        utils.logout_tester_account(self.tester)
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..a2cd1eb 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,8 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
-
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 import six
 
diff --git a/web/regression/README b/web/regression/README
index e0003e4..ef9fd29 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -40,29 +40,40 @@ General Information
     3. test_server_get.py
     4. test_server_update.py
 
-2) The pgAdmin4 source tree includes a file template for the server configuration
-   named ‘test_config.json.in' in the ‘pgAdmin4/web/regression’ directory. After
-   completing the pgAdmin4 configuration, you must make a working copy of the
-   template called test_config.json before modifying the file contents.
+2) The pgAdmin4 source tree includes 2 different configuration file templates.
+   One file template for the server configuration
+   named ‘test_config.json.in' and another for test configuration named
+   'test_advance_config.json.in' in the ‘pgAdmin4/web/regression’ directory.
+   After completing the pgAdmin4 configuration, you must make a working copy of
+   the templates called test_config.json and test_advance_config.json
+   before modifying the file contents.
 
-	2a) The following command copies the test_config.json.in file, creating a
-	    configuration file named test_config.json
+    2a) The following command copies the test_config.json.in file, creating a
+        configuration file named test_config.json (same way user can copy
+        test_advance_config.json.in file into test_advance_config.json)
 
-            # cp pgadmin4/web/regression/test_config.json.in \
-              pgadmin4/web/regression/test_config.json
+             # cp pgadmin4/web/regression/test_config.json.in \
+               pgadmin4/web/regression/test_config.json
 
-	2b) After creating the server configuration file, add (or modify)
-	    parameter values as per requirements. The configuration
-	    files are owned by root/user. The pgAdmin4 regression framework expects
-	    to find the files in the  directory '/<installation dir>/web/regression/'.
-	    If you move the file to another location, you must create a symbolic link
-	    that specifies the new location.
+    2b) After creating the server and test configuration file, add (or modify)
+        parameter values as per requirements. The configuration
+        files are owned by root/user. The pgAdmin4 regression framework expects
+        to find the files in the  directory '/<installation dir>/web/regression/'.
+        If you move the file to another location, you must create a symbolic
+        link that specifies the new location.
 
-	2c) Specifying Server Configuration file:
+    2c) Specifying Server Configuration file:
+
+        server details and connection properties as per their local setup. The
+        test_config file is in json format and property values are
+        case-sensitive.
+
+    2d) Specifying the Test Configuration file:
+
+        The user can add/change test data as per their need. The
+        test_advance_config file is in json format and property values are
+        case-sensitive.
 
-	    The user can use the parameters in the configuration file to specify the
-	    server details and connection properties as per their local setup. The
-	    test_config file is in json format and property values are case-sensitive.
 
 Test Data Details
 -----------------
@@ -92,5 +103,18 @@ Execution:
   and registered automatically by its module name in
   'pgadmin4/web/pgadmin/utils/test.py' file.
 
-- Execute test framework run 'regression/testsuite.py' file.
+- As the test framework is modular and dynamically locates the tests
+  package, We can now executes test framework node wise
+
+- Execute test framework for all nodes
+     run 'regression/testsuite.py --pkg all'
+
+- Execute test framework for single node at a time
+
+     Example 1) Run test framework for 'browser' node
+     run 'regression/testsuite.py --pkg browser'
+
+     Example 2) Run test framework for 'database' node
+     run 'regression/testsuite.py --pkg browser.server_groups.servers.databases'
+
 
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..f48eade 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advance_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/test_advance_config.json.in b/web/regression/test_advance_config.json.in
new file mode 100644
index 0000000..bcb867c
--- /dev/null
+++ b/web/regression/test_advance_config.json.in
@@ -0,0 +1,105 @@
+{
+  "test_add_database_data": [
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  }
+ ],
+
+  "test_db_update_data": [
+  {
+      "test_comment": "This is db update comment"
+  }
+ ]
+
+}
\ No newline at end of file
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..0fa4695
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,40 @@
+# ##################################################################
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import json
+
+from regression.config import config_data
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format(
+        srv_grp, server_id), data = dict(
+        password=config_data['test_server_credentials'][0]['test_db_password']),
+        follow_redirects = True)
+
+    # Connect to database
+    con_response = node.tester.post(
+        'browser/database/connect/{0}/{1}/{2}'.format(
+            srv_grp, server_id, db_id), follow_redirects = True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
\ No newline at end of file
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..f21de54
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,289 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import os
+import pickle
+import json
+import uuid
+
+import config
+from regression.config import config_data
+
+SERVER_URL = '/browser/server/obj/'
+SERVER_CONNECT_URL = 'browser/server/connect/'
+DATABASE_CONNECT_URL = '/browser/database/obj/'
+
+
+def get_ids(url=config.APP_ROOT + '/regression/parent_id.pkl'):
+    """
+    This function read the parent node's id and return it
+
+    :param url: file path from which it will red the ids
+    :type url: str
+    :return: node ids
+    :rtype: dict
+    """
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+
+    return ids
+
+
+def login_tester_account(tester):
+    """
+    This function login the test account using credentials mentioned in
+    config file
+
+    :param tester: test client
+    :type tester: flask test client object
+    :return: None
+    """
+
+    email = \
+        config_data['pgAdmin4_login_credentials']['test_login_username']
+    password = \
+        config_data['pgAdmin4_login_credentials']['test_login_password']
+    response = tester.post('/login', data=dict(
+        email=email, password=password), follow_redirects=True)
+
+
+def logout_tester_account(tester):
+    """
+    This function logout the test account
+
+    :param tester: test client
+    :type tester: flask test client object
+    :return: None
+    """
+
+    response = tester.get('/logout')
+
+
+def get_config_data():
+    """
+    This function get the data related to server group and database
+    like db name, host, port and username etc.
+
+    :return: server_group, db_data, pickle_id_dict
+    :rtype: server_group:dict, db_data:list, pickle_id_dict:dict
+    """
+
+    db_data = []
+
+    pickle_id_dict = {
+        "sid": [],  # server
+        "did": [],  # database
+        "lrid": [],  # login role
+        "tsid": [],  # tablspace
+        "cid": [],  # cast
+        "eid": [],  # extention
+        "lid": [12397],  # language
+        "scid": [],  # schema
+        "tfnid": [],  # trigger function
+        "etid": [],  # event trigger
+        "coid": [],  # collation
+        "fid": [],  # FDW
+        "doid": [],  # Domain
+        "seid": [],  # Sequence
+        "tid": [],  # table
+        "vid": [],  # view
+        "mvid": [],  # mview
+        "fsid": [],  # foreign server
+        "umid": [],  # User mapping
+        "foid": []  # foreign table
+    }
+
+    server_group = config_data['test_server_group']
+
+    for srv in config_data['test_server_credentials']:
+        data = {"name": srv['test_name'],
+                "comment": "",
+                "host": srv['test_host'],
+                "port": srv['test_db_port'],
+                "db": srv['test_maintenance_db'],
+                "username": srv['test_db_username'],
+                "role": "",
+                "sslmode": srv['test_sslmode']}
+        db_data.append(data)
+    return server_group, db_data, pickle_id_dict
+
+
+def write_parent_id(response_data, pickle_id_dict):
+    """
+    This function writes the server's details to file parent_id.pkl
+
+    :param response_data: server's data
+    :type response_data: list of dictionary
+    :param pickle_id_dict: contains ids of server,database,tables etc.
+    :type pickle_id_dict: dict
+    :return: None
+    """
+
+    server_id = response_data['node']['_id']
+    if os.path.isfile(config.APP_ROOT + '/regression/parent_id.pkl'):
+        existed_server_id = open(
+            config.APP_ROOT + '/regression/parent_id.pkl', 'rb')
+        pickle_id_dict = pickle.load(existed_server_id)
+
+    pickle_id_dict["sid"].append(server_id)
+    output = open(config.APP_ROOT + '/regression/parent_id.pkl', 'wb')
+    pickle.dump(pickle_id_dict, output)
+    output.close()
+
+
+def write_db_parent_id(response_data):
+    """
+    This function writes the server and database related data like server
+    name, server id , database name, database id etc.
+
+    :param response_data: server and databases details
+    :type response_data: dict
+    :return: None
+    """
+
+    db_id = response_data['node']['_id']
+    if os.path.isfile(config.APP_ROOT + '/regression/parent_id.pkl'):
+        existing_server_id = open(
+            config.APP_ROOT + '/regression/parent_id.pkl', 'rb')
+        tol_server_id = pickle.load(existing_server_id)
+        pickle_id_dict = tol_server_id
+
+        pickle_id_dict["did"].append(db_id)
+
+        db_output = open(
+            config.APP_ROOT + '/regression/parent_id.pkl', 'wb')
+        pickle.dump(pickle_id_dict, db_output)
+        db_output.close()
+
+
+def delete_parent_id_file():
+    """
+    This function deletes the file parent_id.pkl which contains server and
+    database details
+
+    :return: None
+    """
+
+    if os.path.isfile(config.APP_ROOT + '/regression/parent_id.pkl'):
+        os.remove(config.APP_ROOT + '/regression/parent_id.pkl')
+
+
+def add_server(tester):
+    """
+    This function add the server in the existing server group
+
+    :param tester: test object
+    :type tester: flask test object
+    :return:None
+    """
+
+    server_group, db_data, pickle_id_dict = get_config_data()
+    url = "{0}{1}/".format(SERVER_URL, server_group)
+    response = tester.post(url, data=json.dumps(db_data[0]),
+                           content_type='html/json')
+    response_data = json.loads(response.data.decode())
+    write_parent_id(response_data, pickle_id_dict)
+
+
+def get_server(tester):
+    """
+    This function gets the added serer details
+
+    :param tester: test client object
+    :type tester: flask test object
+    :return: response_data
+    :rtype: list
+    """
+
+    all_id = get_ids()
+    server_id = all_id["sid"][0]
+    server_group = config_data['test_server_group']
+
+    response = tester.get(SERVER_URL + str(server_group) + '/' +
+                          str(server_id),
+                          follow_redirects=True)
+    response_data = json.loads(response.data.decode())
+    return response_data
+
+
+def connect_server(tester):
+    """
+    This function used to connect added server
+
+    :param tester:test client object
+    :type tester: flask test object
+    :return: server_connect, server_group, server_id
+    :rtype: server_connect:dict, server_group:dict, server_id:str
+    """
+
+    srv_id = get_ids()
+    server_id = srv_id["sid"][0]
+    server_group = config_data['test_server_group']
+    response = tester.post(SERVER_CONNECT_URL + str(server_group) +
+                           '/' + server_id,
+                           data=dict(
+                               password=config_data
+                               ['test_server_credentials'][0]
+                               ['test_db_password']),
+                           follow_redirects=True)
+    server_connect = json.loads(response.data.decode())
+    connect_database(tester, server_connect, server_id, server_group)
+    return server_connect, server_group, server_id
+
+
+def connect_database(tester, server_connect, server_id, server_group):
+    """
+    This function is used to connect database and writes it's details to
+    file 'parent_id.pkl'
+
+    :param tester: test client object
+    :type tester: flask test client object
+    :param server_connect: server's data
+    :type server_connect: dict
+    :param server_id: server id
+    :type server_id: str
+    :param server_group: server group name
+    :type server_group: str
+    :return: None
+    """
+
+    if server_connect['data']['connected']:
+        data = {
+            "datacl": config_data['test_add_database_data']
+            ['test_privileges_acl'],
+            "datconnlimit": config_data['test_add_database_data']
+            ['test_conn_limit'],
+            "datowner": config_data['test_add_database_data']
+            ['test_owner'],
+            "deffuncacl": config_data['test_add_database_data']
+            ['test_fun_acl'],
+            "defseqacl": config_data['test_add_database_data']
+            ['test_seq_acl'],
+            "deftblacl": config_data['test_add_database_data']
+            ['test_tbl_acl'],
+            "deftypeacl": config_data['test_add_database_data']
+            ['test_type_acl'],
+            "encoding": config_data['test_add_database_data']
+            ['test_encoding'],
+            "name": str(uuid.uuid4())[1:8],
+            "privileges": config_data['test_add_database_data']
+            ['test_privileges'],
+            "securities": config_data['test_add_database_data']
+            ['test_securities'],
+            "variables": config_data['test_add_database_data']
+            ['test_variables']
+        }
+        db_response = tester.post(
+            DATABASE_CONNECT_URL + str(server_group) + "/" + server_id + "/",
+            data=json.dumps(data),
+            content_type='html/json')
+        response_data = json.loads(db_response.data.decode())
+        write_db_parent_id(response_data)
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 75d437b..c342805 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -10,70 +10,140 @@
 """ This file collect all modules/files present in tests directory and add
 them to TestSuite. """
 
+import argparse
 import os
 import sys
 import unittest
+import logging
 
 from testscenarios.scenarios import generate_scenarios
 
-# We need to include the root directory in sys.path to ensure that we can
-# find everything we need when running in the standalone runtime.
-current_path = os.path.dirname(os.path.realpath(__file__))
-root = os.path.dirname(current_path)
+CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
 
-if sys.path[0] != root:
-    sys.path.insert(0, root)
 
-from pgadmin import create_app
-import config
+def create_pgadmin_app():
+    """
+    This function creates the pgadmin app for testing
 
-# Get the config database schema version. We store this in pgadmin.model
-# as it turns out that putting it in the config files isn't a great idea
-from pgadmin.model import SCHEMA_VERSION
-config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
+    :return: test client
+    :rtype: test app object
+    """
 
-# Create the app!
-app = create_app()
+    # Set sys path to current directory so that we can import pgadmin package
+    root = os.path.dirname(CURRENT_PATH)
+    if sys.path[0] != root:
+        sys.path.insert(0, root)
 
-# Disabling Cross-site request forgery(CSRF token) for testing purpose.
-# CSRF prevent session against malicious Web site, or end users who wants to
-# execute unwanted actions.
-app.config['WTF_CSRF_ENABLED'] = False
+    from pgadmin import create_app
 
-from pgadmin.utils.route import TestsGeneratorRegistry
+    # Create the app
+    app = create_app()
+    app.config['WTF_CSRF_ENABLED'] = False
+    test_app_client = app.test_client()
 
-# Registry will load all the testcases/modules from pgadmin path those are
-# register as BaseTestGenerator.
-TestsGeneratorRegistry.load_generators('pgadmin')
+    return test_app_client
 
-# Create test client
-# werkzeug provides a test client which gives a simple interface to the
-# application. We can trigger test request to the application.
-test_client = app.test_client()
 
+def get_suite(arguments, test_app_client):
+    """
+     This function loads the all modules in the tests directory into testing
+     environment.
 
-def suite():
-    """ Defining test suite which will execute all the testcases present in
-    tests directory according to set priority."""
+    :param arguments: this is command line arguments for module name to
+    which test suite will run
+    :type arguments: str
+    :param test_app_client: test client
+    :type test_app_client: pgadmin app object
+    :return pgadmin_suite: test suite with test cases
+    :rtype: TestSuite
+    """
 
-    pgadmin_suite = unittest.TestSuite()
+    from pgadmin.utils.route import TestsGeneratorRegistry
 
     modules = []
+    pgadmin_suite = unittest.TestSuite()
 
+    # Load the test modules which are in given package(i.e. arguments.pkg)
+    if arguments.pkg == "all":
+        TestsGeneratorRegistry.load_generators('pgadmin')
+    else:
+        TestsGeneratorRegistry.load_generators('pgadmin.{}.tests'.format(
+            arguments.pkg))
+
+    # Get the each test module and add into list
     for key, klass in TestsGeneratorRegistry.registry.items():
         gen = klass
+        modules.append(gen)
 
-        modules.insert(gen.priority, gen)
-
-    for m in modules:
-        obj = m()
-        obj.setTestClient(test_client)
+    # Set the test client to each module & generate the scenarios
+    for module in modules:
+        obj = module()
+        obj.setTestClient(test_app_client)
         scenario = generate_scenarios(obj)
         pgadmin_suite.addTests(scenario)
 
     return pgadmin_suite
 
 
+def add_arguments():
+    """
+    This function parse the command line arguments(project's package name
+    e.g. browser) & add into parser
+
+    :return args: command line argument for pgadmin's package name
+    :rtype: argparse namespace
+    """
+
+    parser = argparse.ArgumentParser(description='Test suite for pgAdmin4')
+    parser.add_argument('--pkg', help='Executes the test cases of particular'
+                                      ' package')
+    arg = parser.parse_args()
+
+    return arg
+
+
+class StreamToLogger(object):
+    def __init__(self, logger, log_level=logging.INFO):
+        self.terminal = sys.stderr
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        """
+        This function writes the log in the logger file as well as on console
+
+        :param buf: log message
+        :type buf: str
+        :return: None
+        """
+
+        self.terminal.write(buf)
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
+
 if __name__ == '__main__':
-    suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    # Set basic logging configuration for log file
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    # Create logger to write log in the logger file with on console
+    stderr_logger = logging.getLogger('STDERR')
+    sys.stderr = StreamToLogger(stderr_logger, logging.ERROR)
+
+    # Create the pgadmin app
+    test_client = create_pgadmin_app()
+    args = add_arguments()
+    suite = get_suite(args, test_client)
+    tests = unittest.TextTestRunner(stream=sys.stderr, descriptions=True,
+                                    verbosity=2).run(suite)
+
+    print("\n\n Please check output in file: logger.log placed at ",
+          CURRENT_PATH)
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to