class ShishitoControlTest(object): """ Base class for ControlTest objects. """ def __init__(self): self.shishito_support = ShishitoSupport() # create control environment object control_env_obj = self.shishito_support.get_module('test_environment') self.test_environment = control_env_obj(self.shishito_support) self.driver = None def start_browser(self): """ Webdriver startup function. :return: initialized webdriver """ base_url = self.shishito_support.get_opt('base_url') config_section = self.shishito_support.get_opt('environment_configuration') # call browser from proper environment self.driver = self.test_environment.call_browser(config_section) # load init url if base_url: self.test_init(base_url) return self.driver def start_test(self, reload_page=None): """ To be executed before every test-case (test function). :param reload_page: """ def stop_browser(self): """ Webdriver termination function. """ self.driver.quit() def stop_test(self, test_info): """ To be executed after every test-case (test function). If test failed, function saves screenshots created during test. :param test_info: information about test """ if test_info.test_status not in ('passed', None): # save screenshot in case test fails screenshot_folder = os.path.join(self.shishito_support.project_root, 'screenshots') if not os.path.exists(screenshot_folder): os.makedirs(screenshot_folder) file_name = re.sub('[^A-Za-z0-9_. ]+', '', test_info.test_name) self.driver.save_screenshot(os.path.join(screenshot_folder, file_name + '.png')) def test_init(self, url): """ Executed only once after browser starts.
class ShishitoRunner(object): """ Base shishito test runner. - runs python selenium tests on customizable configurations (using PyTest) - archive the test results in .zip file """ def __init__(self, project_root): # set project root self.project_root = project_root # test timestamp - for storing results self.test_timestamp = time.strftime("%Y-%m-%d_%H-%M-%S") self.epoch = int(time.time()) # parse cmd args self.cmd_args = self.handle_cmd_args() # Get SUT build for use in reporting self.test_build = self.cmd_args['build'] self.reporter = Reporter(project_root, self.test_timestamp) self.shishito_support = ShishitoSupport( cmd_args=self.cmd_args, project_root=self.project_root ) def handle_cmd_args(self): """ Retrieve command line arguments passed to the script. :return: dict with parsed command line arguments """ parser = argparse.ArgumentParser(description='Selenium Python test runner execution arguments.') parser.add_argument('--platform', help='Platform on which run tests.', dest='test_platform') parser.add_argument('--environment', help='Environment for which run tests.', dest='test_environment') parser.add_argument('--test_directory', help='Directory where to lookup for tests') parser.add_argument('--smoke', help='Run only smoke tests', action='store_true') parser.add_argument('--browserstack', help='BrowserStack credentials; format: "username:token"') parser.add_argument('--saucelabs', help='Saucelabs credentials; format: "username:token"') parser.add_argument('--test_rail', help='TestRail Test Management tool credentials; format: "username:password"') parser.add_argument('--qastats', help='QAStats Test Management tool credentials; format: "token"') parser.add_argument('--node_webkit_chromedriver_path', help='Path to chromedriver located in same directory as node-webkit application') parser.add_argument('--app', help='Path to appium application') parser.add_argument('--test', help='Run specified test (PyTest string expression)') parser.add_argument('--build', help='Specify build number for reporting purposes') parser.add_argument('--maxfail', help='stop after x failures') args = parser.parse_args() # return args dict --> for use in other classes return vars(args) def run_tests(self): """ Execute tests for given platform and environment. Platform and Environment can be passed as command lines argument or settings in config file. """ if __name__ == "__main__": sys.exit('The runner cannot be executed directly.' ' You need to import it within project specific runner. Session terminated.') # cleanup previous results self.reporter.cleanup_results() # import execution class executor_class = self.shishito_support.get_module('platform_execution') # executor_class = getattr(import_module(platform_path), 'ControlExecution') executor = executor_class(self.shishito_support, self.test_timestamp) # run test exit_code = executor.run_tests() # archive results + generate combined report self.reporter.archive_results() self.reporter.generate_combined_report() # upload results to QAStats test management app qastats_credentials = self.shishito_support.get_opt('qastats') if qastats_credentials: try: qas_user, qas_password = qastats_credentials.split(':', 1) except (AttributeError, ValueError): raise ValueError('QAStats credentials were not specified! Unable to connect to QAStats.') qastats = QAStats(qas_user, qas_password, self.test_timestamp, self.epoch, self.test_build) qastats.post_results() # upload results to TestRail test management app test_rail_credentials = self.shishito_support.get_opt('test_rail') if test_rail_credentials: try: tr_user, tr_password = test_rail_credentials.split(':', 1) except (AttributeError, ValueError): raise ValueError('TestRail credentials were not specified! Unable to connect to TestRail.') test_rail = TestRail(tr_user, tr_password, self.test_timestamp, self.test_build) test_rail.post_results() return exit_code
class ShishitoControlTest(object): """ Base class for ControlTest objects. """ def __init__(self): self.shishito_support = ShishitoSupport() # create control environment object control_env_obj = self.shishito_support.get_module('test_environment') self.test_environment = control_env_obj(self.shishito_support) self.drivers = [] def start_browser(self, base_url = None): """ Webdriver startup function. :return: initialized webdriver """ config_section = self.shishito_support.get_opt('environment_configuration') # call browser from proper environment driver = self.test_environment.call_browser(config_section) self.drivers.append(driver) # load init url if not base_url: base_url = self.shishito_support.get_opt('base_url') if base_url: self.test_init(driver, base_url) else: self.test_init(driver) return driver def start_test(self, reload_page=None): """ To be executed before every test-case (test function). :param reload_page: """ def stop_browser(self): """ Webdriver termination function. """ for driver in self.drivers: driver.quit() # Cleanup the driver info del self.drivers[:] def stop_test(self, test_info, debug_events=None): """ To be executed after every test-case (test function). If test failed, function saves screenshots created during test. :param test_info: information about test """ if test_info.test_status not in ('passed', None): # save screenshot in case test fails test_name = re.sub('[^A-Za-z0-9_.]+', '_', test_info.test_name) # Capture screenshot and debug info from driver(s) for driver in self.drivers: if(self.shishito_support.test_platform == 'mobile'): browser_name = 'appium' else: browser_name = driver.name file_name = browser_name + '_' + test_name ts = SeleniumTest(driver) ts.save_screenshot(name=file_name) #Save debug info to file if debug_events is not None: debugevent_folder = os.path.join(self.shishito_support.project_root, 'debug_events') if not os.path.exists(debugevent_folder): os.makedirs(debugevent_folder) with open(os.path.join(debugevent_folder, file_name + '.json'), 'w') as logfile: json.dump(debug_events, logfile) def test_init(self, driver, url=None): """ Executed only once after browser starts.
class ShishitoRunner(object): """ Base shishito test runner. - runs python selenium tests on customizable configurations (using PyTest) - archive the test results in .zip file """ def __init__(self, project_root): # set project root self.project_root = project_root # test timestamp - for storing results self.test_timestamp = time.strftime("%Y-%m-%d_%H-%M-%S") self.epoch = int(time.time()) # parse cmd args self.cmd_args = self.handle_cmd_args() # Get SUT build for use in reporting self.test_build = self.cmd_args['build'] self.reporter = Reporter(project_root, self.test_timestamp) self.shishito_support = ShishitoSupport(cmd_args=self.cmd_args, project_root=self.project_root) def handle_cmd_args(self): """ Retrieve command line arguments passed to the script. :return: dict with parsed command line arguments """ parser = argparse.ArgumentParser( description='Selenium Python test runner execution arguments.') parser.add_argument('--platform', help='Platform on which run tests.', dest='test_platform') parser.add_argument('--environment', help='Environment for which run tests.', dest='test_environment') parser.add_argument('--test_directory', help='Directory where to lookup for tests') parser.add_argument('--smoke', help='Run only smoke tests', action='store_true') parser.add_argument( '--browserstack', help='BrowserStack credentials; format: "username:token"') parser.add_argument( '--saucelabs', help='Saucelabs credentials; format: "username:token"') parser.add_argument( '--test_rail', help= 'TestRail Test Management tool credentials; format: "username:password"' ) parser.add_argument( '--qastats', help='QAStats Test Management tool credentials; format: "token"') parser.add_argument( '--node_webkit_chromedriver_path', help= 'Path to chromedriver located in same directory as node-webkit application' ) parser.add_argument('--app', help='Path to appium application') parser.add_argument( '--test', help='Run specified test (PyTest string expression)') parser.add_argument('--build', help='Specify build number for reporting purposes') args = parser.parse_args() # return args dict --> for use in other classes return vars(args) def run_tests(self): """ Execute tests for given platform and environment. Platform and Environment can be passed as command lines argument or settings in config file. """ if __name__ == "__main__": sys.exit( 'The runner cannot be executed directly.' ' You need to import it within project specific runner. Session terminated.' ) # cleanup previous results self.reporter.cleanup_results() # import execution class executor_class = self.shishito_support.get_module('platform_execution') # executor_class = getattr(import_module(platform_path), 'ControlExecution') executor = executor_class(self.shishito_support, self.test_timestamp) # run test exit_code = executor.run_tests() # archive results + generate combined report self.reporter.archive_results() self.reporter.generate_combined_report() # upload results to QAStats test management app qastats_credentials = self.shishito_support.get_opt('qastats') if qastats_credentials: try: qas_user, qas_password = qastats_credentials.split(':', 1) except (AttributeError, ValueError): raise ValueError( 'QAStats credentials were not specified! Unable to connect to QAStats.' ) qastats = QAStats(qas_user, qas_password, self.test_timestamp, self.epoch, self.test_build) qastats.post_results() # upload results to TestRail test management app test_rail_credentials = self.shishito_support.get_opt('test_rail') if test_rail_credentials: try: tr_user, tr_password = test_rail_credentials.split(':', 1) except (AttributeError, ValueError): raise ValueError( 'TestRail credentials were not specified! Unable to connect to TestRail.' ) test_rail = TestRail(tr_user, tr_password, self.test_timestamp, self.test_build) test_rail.post_results() return exit_code
class ShishitoControlTest(object): """ Base class for ControlTest objects. """ def __init__(self): self.shishito_support = ShishitoSupport() # create control environment object control_env_obj = self.shishito_support.get_module('test_environment') self.test_environment = control_env_obj(self.shishito_support) self.drivers = [] def start_browser(self, base_url=None): """ Webdriver startup function. :return: initialized webdriver """ config_section = self.shishito_support.get_opt( 'environment_configuration') # call browser from proper environment driver = self.test_environment.call_browser(config_section) self.drivers.append(driver) # load init url if not base_url: base_url = self.shishito_support.get_opt('base_url') if base_url: self.test_init(driver, base_url) return driver def start_test(self, reload_page=None): """ To be executed before every test-case (test function). :param reload_page: """ def stop_browser(self): """ Webdriver termination function. """ for driver in self.drivers: driver.quit() def stop_test(self, test_info, debug_events=None): """ To be executed after every test-case (test function). If test failed, function saves screenshots created during test. :param test_info: information about test """ if test_info.test_status not in ('passed', None): # save screenshot in case test fails test_name = re.sub('[^A-Za-z0-9_.]+', '_', test_info.test_name) # Capture screenshot and debug info from driver(s) for driver in self.drivers: browser_name = driver.name file_name = browser_name + '_' + test_name ts = SeleniumTest(driver) ts.save_screenshot(file_name) #Save debug info to file if debug_events is not None: debugevent_folder = os.path.join( self.shishito_support.project_root, 'debug_events') if not os.path.exists(debugevent_folder): os.makedirs(debugevent_folder) with open( os.path.join(debugevent_folder, file_name + '.json'), 'w') as logfile: json.dump(debug_events, logfile) def test_init(self, driver, url): """ Executed only once after browser starts.