gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.3KB

  1. #############################################################
  2. #
  3. # pgAdmin 4 - PostgreSQL Tools
  4. #
  5. # Copyright (C) 2013 - 2020, The pgAdmin Development Team
  6. # This software is released under the PostgreSQL Licence
  7. #
  8. ##############################################################
  9. import sys
  10. import traceback
  11. from abc import ABCMeta, abstractmethod
  12. from importlib import import_module
  13. import six
  14. from werkzeug.utils import find_modules
  15. from pgadmin.utils import server_utils
  16. import unittest
  17. class TestsGeneratorRegistry(ABCMeta):
  18. """
  19. class TestsGeneratorRegistry(object)
  20. Every module will be registered automatically by its module name.
  21. Class-level Methods:
  22. ----------- -------
  23. * __init__(...)
  24. - This is used to register test modules. You don't need to
  25. call this function explicitly. This will be automatically executed,
  26. whenever we create a class and inherit from BaseTestGenerator -
  27. it will register it as an available module in TestsGeneratorRegistry.
  28. By setting the __metaclass__ for BaseTestGenerator to
  29. TestsGeneratorRegistry it will create new instance of this
  30. TestsGeneratorRegistry per class.
  31. * load_generators():
  32. - This function will load all the modules from __init__()
  33. present in registry.
  34. """
  35. registry = dict()
  36. def __init__(cls, name, bases, d):
  37. # Register this type of module, based on the module name
  38. # Avoid registering the BaseDriver itself
  39. if name != 'BaseTestGenerator' and name != 'BaseFeatureTest':
  40. # Store/append test classes in 'registry' if test modules has
  41. # multiple classes
  42. if d['__module__'] in TestsGeneratorRegistry.registry:
  43. TestsGeneratorRegistry.registry[d['__module__']].append(cls)
  44. else:
  45. TestsGeneratorRegistry.registry[d['__module__']] = [cls]
  46. ABCMeta.__init__(cls, name, bases, d)
  47. @classmethod
  48. def load_generators(cls, pkg_root, exclude_pkgs, for_modules=[],
  49. is_resql_only=False):
  50. cls.registry = dict()
  51. all_modules = []
  52. all_modules += find_modules(pkg_root, False, True)
  53. if 'resql' not in exclude_pkgs:
  54. # Append reverse engineered test case module
  55. all_modules.append('regression.re_sql.tests.test_resql')
  56. # If specific modules are to be tested, exclude others
  57. # for modules are handled differently for resql
  58. if not is_resql_only and len(for_modules) > 0:
  59. all_modules = [module_name
  60. for module_name in all_modules
  61. for fmod in for_modules
  62. if module_name.endswith(fmod)]
  63. # Set the module list and exclude packages in the BaseTestGenerator
  64. # for Reverse Engineer SQL test cases.
  65. BaseTestGenerator.setReSQLModuleList(all_modules)
  66. BaseTestGenerator.setExcludePkgs(exclude_pkgs)
  67. # Check if only reverse engineered sql test cases to run
  68. # if yes then import only that module
  69. if is_resql_only:
  70. BaseTestGenerator.setForModules(for_modules)
  71. try:
  72. import_module('regression.re_sql.tests.test_resql')
  73. except ImportError:
  74. traceback.print_exc(file=sys.stderr)
  75. else:
  76. # Check for SERVER mode
  77. for module_name in all_modules:
  78. try:
  79. if "tests." in str(module_name) and not any(
  80. str(module_name).startswith(
  81. 'pgadmin.' + str(exclude_pkg)
  82. ) for exclude_pkg in exclude_pkgs
  83. ):
  84. import_module(module_name)
  85. except ImportError:
  86. traceback.print_exc(file=sys.stderr)
  87. @six.add_metaclass(TestsGeneratorRegistry)
  88. class BaseTestGenerator(unittest.TestCase):
  89. # Defining abstract method which will override by individual testcase.
  90. def setUp(self):
  91. super(BaseTestGenerator, self).setUp()
  92. self.server_id = self.server_information["server_id"]
  93. server_con = server_utils.connect_server(self, self.server_id)
  94. if hasattr(self, 'skip_on_database') and \
  95. 'data' in server_con and 'type' in server_con['data'] and \
  96. server_con['data']['type'] in self.skip_on_database:
  97. self.skipTest('cannot run in: %s' % server_con['data']['type'])
  98. def setTestServer(self, server):
  99. self.server = server
  100. @abstractmethod
  101. def runTest(self):
  102. pass
  103. # Initializing app.
  104. def setApp(self, app):
  105. self.app = app
  106. # Initializing test_client.
  107. @classmethod
  108. def setTestClient(cls, test_client):
  109. cls.tester = test_client
  110. def setDriver(self, driver):
  111. self.driver = driver
  112. def setServerInformation(self, server_information):
  113. self.server_information = server_information
  114. def setTestDatabaseName(self, database_name):
  115. self.test_db = database_name
  116. @classmethod
  117. def setReSQLModuleList(cls, module_list):
  118. cls.re_sql_module_list = module_list
  119. @classmethod
  120. def setExcludePkgs(cls, exclude_pkgs):
  121. cls.exclude_pkgs = exclude_pkgs
  122. @classmethod
  123. def setForModules(cls, for_modules):
  124. cls.for_modules = for_modules
上海开阖软件有限公司 沪ICP备12045867号-1