def run_tests(targeted_packages, test_output_location, test_res, parsed_args): err_results = [] clean_coverage(coverage_dir) # base command array without a targeted package command_array = [sys.executable, "-m", "pytest"] command_array.extend(test_res) # loop through the packages logging.info("Running pytest for {}".format(targeted_packages)) for index, target_package in enumerate(targeted_packages): logging.info( "Running pytest for {}. {} of {}.".format( target_package, index, len(targeted_packages) ) ) package_name = os.path.basename(target_package) source_coverage_file = os.path.join(root_dir, ".coverage") target_coverage_file = os.path.join( coverage_dir, ".coverage_{}".format(package_name) ) target_package_options = [] allowed_return_codes = [] local_command_array = command_array[:] # Get code coverage params for current package coverage_commands = create_code_coverage_params(parsed_args, package_name) # Create local copy of params to pass to execute local_command_array.extend(coverage_commands) # if we are targeting only packages that are management plane, it is a possibility # that no tests running is an acceptable situation # we explicitly handle this here. if is_error_code_5_allowed(target_package, package_name): allowed_return_codes.append(5) # format test result output location if test_output_location: target_package_options.extend( [ "--junitxml", os.path.join( "TestResults/{}/".format(package_name), test_output_location ), ] ) target_package_options.append(target_package) err_result = run_check_call( local_command_array + target_package_options, root_dir, allowed_return_codes, True, False, ) if err_result: logging.error("Errors present in {}".format(package_name)) err_results.append(err_result) if os.path.isfile(source_coverage_file): shutil.move(source_coverage_file, target_coverage_file) if not parsed_args.disablecov: collect_pytest_coverage_files(targeted_packages) # if any of the packages failed, we should get exit with errors if err_results: exit(1)
def prep_and_run_tox(targeted_packages, parsed_args, options_array=[]): if parsed_args.wheel_dir: os.environ["PREBUILT_WHEEL_DIR"] = parsed_args.wheel_dir if parsed_args.mark_arg: options_array.extend(["-m", "{}".format(parsed_args.mark_arg)]) tox_command_tuples = [] for index, package_dir in enumerate(targeted_packages): destination_tox_ini = os.path.join(package_dir, "tox.ini") destination_dev_req = os.path.join(package_dir, "dev_requirements.txt") tox_execution_array = [sys.executable, "-m", "tox"] local_options_array = options_array[:] # Get code coverage params for current package package_name = os.path.basename(package_dir) coverage_commands = create_code_coverage_params( parsed_args, package_name) local_options_array.extend(coverage_commands) # if we are targeting only packages that are management plane, it is a possibility # that no tests running is an acceptable situation # we explicitly handle this here. if is_error_code_5_allowed(package_dir, package_name): local_options_array.append("--suppress-no-test-exit-code") # if not present, re-use base if not os.path.exists(destination_tox_ini) or ( os.path.exists(destination_tox_ini) and os.path.basename(package_dir) in IGNORED_TOX_INIS): logging.info( "No customized tox.ini present, using common eng/tox/tox.ini for {}" .format(os.path.basename(package_dir))) tox_execution_array.extend(["-c", DEFAULT_TOX_INI_LOCATION]) # handle empty file if not os.path.exists(destination_dev_req): logging.info("No dev_requirements present.") with open(destination_dev_req, "w+") as file: file.write("\n") if in_ci(): replace_dev_reqs(destination_dev_req) os.environ["TOX_PARALLEL_NO_SPINNER"] = "1" inject_custom_reqs(destination_dev_req, parsed_args.injected_packages, package_dir) if parsed_args.tox_env: tox_execution_array.extend(["-e", parsed_args.tox_env]) if parsed_args.tenvparallel: tox_execution_array.extend(["-p", "all"]) if local_options_array: tox_execution_array.extend(["--"] + local_options_array) tox_command_tuples.append((tox_execution_array, package_dir)) if parsed_args.tparallel: return_code = execute_tox_parallel(tox_command_tuples) else: return_code = execute_tox_serial(tox_command_tuples) if not parsed_args.disablecov: collect_tox_coverage_files(targeted_packages) sys.exit(return_code)