TestCaseMaster.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. from baangt.base import GlobalConstants as GC
  2. from baangt.base.Timing.Timing import Timing
  3. from baangt.TestSteps.Exceptions import *
  4. class TestCaseMaster:
  5. def __init__(self, **kwargs):
  6. self.name = None
  7. self.description = None
  8. self.testSteps = {}
  9. self.apiInstance = None
  10. self.numberOfParallelRuns = None
  11. self.testRunInstance = kwargs.get(GC.KWARGS_TESTRUNINSTANCE)
  12. self.testRunUtils = self.testRunInstance.testRunUtils
  13. self.testSequence = self.testRunUtils.getSequenceByNumber(testRunName=self.testRunInstance.testRunName,
  14. sequence=kwargs.get(GC.STRUCTURE_TESTCASESEQUENCE))
  15. self.testCaseSettings = self.testRunUtils.getTestCaseByNumber(self.testSequence,
  16. kwargs.get(GC.STRUCTURE_TESTCASE))
  17. self.testSteps = self.testCaseSettings[2][GC.STRUCTURE_TESTSTEP]
  18. self.testCaseType = self.testCaseSettings[1][GC.KWARGS_TESTCASETYPE]
  19. self.kwargs = kwargs
  20. # self.timing : Timing = self.kwargs.get(GC.KWARGS_TIMING)
  21. self.timing = Timing()
  22. self.sequenceNumber = self.kwargs.get(GC.KWARGS_SEQUENCENUMBER)
  23. self.timingName = self.timing.takeTime(self.__class__.__name__, forceNew=True)
  24. if self.testCaseType == GC.KWARGS_BROWSER:
  25. self.kwargs[GC.KWARGS_DATA][GC.TESTCASESTATUS] = GC.TESTCASESTATUS_SUCCESS # We believe in a good outcome
  26. self.__getBrowserForTestCase()
  27. elif self.testCaseType == GC.KWARGS_API_SESSION:
  28. # FIXME: For now we're using session_number always = 1. We need to be able to run e.g. 10 sessions with
  29. # FIXME: Parallel API-Test.
  30. self.apiInstance = self.testRunInstance.getAPI()
  31. self.kwargs[GC.KWARGS_API_SESSION] = self.apiInstance
  32. # For API-Tests we assume status = Passed and actively set it to error if not.
  33. self.kwargs[GC.KWARGS_DATA][GC.TESTCASESTATUS] = GC.TESTCASESTATUS_SUCCESS
  34. self.execute()
  35. self.tearDown()
  36. def __getBrowserForTestCase(self):
  37. logger.info(f"Settings for this TestCase: {str(self.testCaseSettings)[0:100]}")
  38. self.browserType = self.testCaseSettings[1][GC.KWARGS_BROWSER].upper()
  39. self.browserSettings = self.testCaseSettings[1][GC.BROWSER_ATTRIBUTES]
  40. self.mobileType = self.testCaseSettings[1].get(GC.KWARGS_MOBILE)
  41. self.mobileApp = self.testCaseSettings[1].get(GC.KWARGS_MOBILE_APP)
  42. browserWindowSize = self.testCaseSettings[1].get(GC.BROWSER_WINDOW_SIZE)
  43. self.mobile_desired_app = {}
  44. self.mobile_app_setting = {}
  45. if self.mobileType:
  46. self.mobile_desired_app[GC.MOBILE_PLATFORM_NAME] = self.testCaseSettings[1][GC.MOBILE_PLATFORM_NAME]
  47. self.mobile_desired_app[GC.MOBILE_DEVICE_NAME] = self.testCaseSettings[1][GC.MOBILE_DEVICE_NAME]
  48. self.mobile_desired_app[GC.MOBILE_PLATFORM_VERSION] = self.testCaseSettings[1][GC.MOBILE_PLATFORM_VERSION]
  49. self.mobile_app_setting[GC.MOBILE_APP_URL] = self.testCaseSettings[1][GC.MOBILE_APP_URL]
  50. self.mobile_app_setting[GC.MOBILE_APP_PACKAGE] = self.testCaseSettings[1][GC.MOBILE_APP_PACKAGE]
  51. self.mobile_app_setting[GC.MOBILE_APP_ACTIVITY] = self.testCaseSettings[1][GC.MOBILE_APP_ACTIVITY]
  52. self.browser = self.testRunInstance.getBrowser(browserInstance=self.sequenceNumber,
  53. browserName=self.browserType,
  54. browserAttributes=self.browserSettings,
  55. mobileType=self.mobileType,
  56. mobileApp=self.mobileApp,
  57. desired_app=self.mobile_desired_app,
  58. mobile_app_setting=self.mobile_app_setting,
  59. browserWindowSize=browserWindowSize)
  60. self.kwargs[GC.KWARGS_BROWSER] = self.browser
  61. def execute(self):
  62. # Save timing Class from Testrun for later:
  63. lTestRunTiming = self.kwargs[GC.KWARGS_TIMING]
  64. # Replace Timing class with current, local timing class:
  65. self.kwargs[GC.KWARGS_TIMING] = self.timing
  66. # Get all the TestSteps for the global loop, that are kept within this TestCase:
  67. lTestStepClasses = {}
  68. for testStepSequenceNumer, testStep in enumerate(self.testSteps.keys(),start=1):
  69. lTestStepClasses[testStepSequenceNumer] = self.testSteps[testStep][0]["TestStepClass"]
  70. try:
  71. self.testRunInstance.executeDictSequenceOfClasses(lTestStepClasses, GC.STRUCTURE_TESTSTEP, **self.kwargs)
  72. except baangtTestStepException as e:
  73. logger.info(f"Testcase {self.kwargs.get(GC.STRUCTURE_TESTSTEP,'')} failed")
  74. self.kwargs[GC.KWARGS_DATA][GC.TESTCASEERRORLOG] += '\n' + "Exception-Text: " + str(e)
  75. self.kwargs[GC.KWARGS_DATA][GC.TESTCASESTATUS] = GC.TESTCASESTATUS_ERROR
  76. finally:
  77. self._finalizeTestCase()
  78. # Switch back to global Timing class:
  79. self.kwargs[GC.KWARGS_TIMING] = lTestRunTiming
  80. def _finalizeTestCase(self):
  81. tcData = self.kwargs[GC.KWARGS_DATA]
  82. tcData[GC.TIMING_DURATION] = self.timing.takeTime(self.timingName) # Write the End-Record for this Testcase
  83. tcData[GC.TIMELOG] = self.timing.returnTime()
  84. self.timing.resetTime(self.timingName)
  85. def _checkAndSetTestcaseStatusIfFailExpected(self):
  86. """
  87. If this Testcase is supposed to fail and failed, he's actually successful.
  88. If this Testcase is supposed to fail and doesn't, he's actually failed.
  89. @return: Directly sets the Testcasestatus accordingly.
  90. """
  91. tcData = self.kwargs[GC.KWARGS_DATA]
  92. if tcData.get(GC.TESTCASE_EXPECTED_ERROR_FIELD) == 'X':
  93. if tcData[GC.TESTCASESTATUS] == GC.TESTCASESTATUS_ERROR:
  94. tcData[GC.TESTCASESTATUS] = GC.TESTCASESTATUS_SUCCESS
  95. elif tcData[GC.TESTCASESTATUS] == GC.TESTCASESTATUS_SUCCESS:
  96. tcData[GC.TESTCASESTATUS] = GC.TESTCASESTATUS_ERROR
  97. def tearDown(self):
  98. data = self.kwargs[GC.KWARGS_DATA]
  99. # If TestcaseErrorlog is not empty, the testcase status should be error.
  100. if data[GC.TESTCASEERRORLOG]:
  101. data[GC.TESTCASESTATUS] = GC.TESTCASESTATUS_ERROR
  102. if self.kwargs[GC.KWARGS_DATA][GC.TESTCASESTATUS] == GC.TESTCASESTATUS_ERROR:
  103. # Try taking a Screenshot
  104. if self.testCaseType == GC.KWARGS_BROWSER:
  105. data[GC.SCREENSHOTS] = self.kwargs[GC.KWARGS_DATA][GC.SCREENSHOTS] \
  106. + '\n' + self.browser.takeScreenshot()
  107. # If Testcase-Status was not set, we'll set error. Shouldn't happen anyways.
  108. if not self.kwargs[GC.KWARGS_DATA][GC.TESTCASESTATUS]:
  109. data[GC.TESTCASESTATUS] = GC.TESTCASESTATUS_ERROR
  110. data[GC.TESTCASEERRORLOG] += "\nTestcase had not status - setting error"
  111. logger.critical("Testcase had no status - setting error")
  112. self._checkAndSetTestcaseStatusIfFailExpected()