def _get_profile(profile): import colorama colorama.init(autoreset=True) try: fore_red = colorama.Fore.RED if not IS_WINDOWS else '' fore_reset = colorama.Fore.RESET if not IS_WINDOWS else '' current_profile = raw_cmd('az cloud show --query profile -otsv', show_stderr=False).result if not profile or current_profile == profile: profile = current_profile display( 'The tests are set to run against current profile {}.'.format( fore_red + current_profile + fore_reset)) elif current_profile != profile: display( 'The tests are set to run against profile {} but the current az cloud profile is {}.' .format(fore_red + profile + fore_reset, fore_red + current_profile + fore_reset)) result = raw_cmd( 'az cloud update --profile {}'.format(profile), 'SWITCHING TO PROFILE {}.'.format(fore_red + profile + fore_reset)) if result.exit_code != 0: raise CLIError(result.error.output) return current_profile except CalledProcessError: raise CLIError('Failed to retrieve current az profile')
def run_tests(tests, xml_path=None, discover=False, in_series=False, run_live=False, profile=None, last_failed=False, pytest_args=None, git_source=None, git_target=None, git_repo=None): require_virtual_env() DEFAULT_RESULT_FILE = 'test_results.xml' DEFAULT_RESULT_PATH = os.path.join(get_azdev_config_dir(), DEFAULT_RESULT_FILE) from .pytest_runner import get_test_runner heading('Run Tests') original_profile = _get_profile(profile) if not profile: profile = original_profile path_table = get_path_table() test_index = _get_test_index(profile, discover) if not tests: tests = list(path_table['mod'].keys()) + list(path_table['core'].keys()) + list(path_table['ext'].keys()) if tests == ['CLI']: tests = list(path_table['mod'].keys()) + list(path_table['core'].keys()) elif tests == ['EXT']: tests = list(path_table['ext'].keys()) # filter out tests whose modules haven't changed tests = _filter_by_git_diff(tests, test_index, git_source, git_target, git_repo) if tests: display('\nTESTS: {}\n'.format(', '.join(tests))) # resolve the path at which to dump the XML results xml_path = xml_path or DEFAULT_RESULT_PATH if not xml_path.endswith('.xml'): xml_path = os.path.join(xml_path, DEFAULT_RESULT_FILE) # process environment variables if run_live: logger.warning('RUNNING TESTS LIVE') os.environ[ENV_VAR_TEST_LIVE] = 'True' def _find_test(index, name): name_comps = name.split('.') num_comps = len(name_comps) key_error = KeyError() for i in range(num_comps): check_name = '.'.join(name_comps[(-1 - i):]) try: match = index[check_name] if check_name != name: logger.info("Test found using just '%s'. The rest of the name was ignored.\n", check_name) return match except KeyError as ex: key_error = ex continue raise key_error # lookup test paths from index test_paths = [] for t in tests: try: test_path = os.path.normpath(_find_test(test_index, t)) test_paths.append(test_path) except KeyError: logger.warning("'%s' not found. If newly added, re-run with --discover", t) continue # Tests have been collected. Now run them. if not test_paths: raise CLIError('No tests selected to run.') runner = get_test_runner(parallel=not in_series, log_path=xml_path, last_failed=last_failed) exit_code = runner(test_paths=test_paths, pytest_args=pytest_args) _summarize_test_results(xml_path) # attempt to restore the original profile if profile != original_profile: result = raw_cmd('az cloud update --profile {}'.format(original_profile), "Restoring profile '{}'.".format(original_profile)) if result.exit_code != 0: logger.warning("Failed to restore profile '%s'.", original_profile) sys.exit(0 if not exit_code else 1)