def _get_test_suites(self, xcresult_collector: XcResultCollector, show_found_result: bool = False, save_xcresult_dir: Optional[pathlib.Path] = None): if show_found_result: self.logger.info(Colors.GREEN('Found test results at')) for xcresult in xcresult_collector.get_collected_results(): self.logger.info('- %s', xcresult) self.logger.info('') xcresult = xcresult_collector.get_merged_xcresult() try: test_suites = XcResultConverter.xcresult_to_junit(xcresult) finally: if save_xcresult_dir: shutil.copytree(xcresult, save_xcresult_dir / xcresult.name) xcresult_collector.forget_merged_result() return test_suites, xcresult
def _collect_xcresults(self, xcresult_patterns: Optional[Sequence[pathlib.Path]], xcresult_dirs: Sequence[pathlib.Path]) -> XcResultCollector: glob_patterns: List[pathlib.Path] = [] for xcresult_pattern in (xcresult_patterns or []): if xcresult_pattern.suffix != '.xcresult': raise TestResultArgument.XCRESULT_PATTERNS.raise_argument_error('Not a Xcode Test Result pattern') glob_patterns.append(xcresult_pattern) for xcresult_dir in xcresult_dirs: glob_patterns.append(xcresult_dir / '**/*.xcresult') xcresult_collector = XcResultCollector() for xcresult in self.find_paths(*glob_patterns): xcresult_collector.gather_results(xcresult) return xcresult_collector
def run_test(self, xcode_project_path: Optional[pathlib.Path] = None, xcode_workspace_path: Optional[pathlib.Path] = None, target_name: Optional[str] = None, configuration_name: Optional[str] = None, scheme_name: Optional[str] = None, clean: bool = False, devices: Optional[List[str]] = None, disable_code_coverage: bool = False, max_concurrent_devices: Optional[int] = TestArgument.MAX_CONCURRENT_DEVICES.get_default(), max_concurrent_simulators: Optional[int] = TestArgument.MAX_CONCURRENT_SIMULATORS.get_default(), test_only: Optional[str] = TestArgument.TEST_ONLY.get_default(), test_sdk: str = TestArgument.TEST_SDK.get_default(), test_xcargs: Optional[str] = XcodeArgument.TEST_XCARGS.get_default(), test_flags: Optional[str] = XcodeArgument.TEST_FLAGS.get_default(), disable_xcpretty: bool = False, xcpretty_options: str = XcprettyArgument.OPTIONS.get_default(), output_dir: pathlib.Path = TestResultArgument.OUTPUT_DIRECTORY.get_default(), output_extension: str = TestResultArgument.OUTPUT_EXTENSION.get_default(), graceful_exit: bool = False): """ Run unit or UI tests for given Xcode project or workspace """ self._ensure_project_or_workspace(xcode_project_path, xcode_workspace_path) simulators = self._get_test_destinations(devices) xcodebuild = self._get_xcodebuild(**locals()) clean and self._clean(xcodebuild) self.echo(Colors.BLUE(f'Run tests for {(xcodebuild.workspace or xcodebuild.xcode_project).name}\n')) xcresult_collector = XcResultCollector() xcresult_collector.ignore_results(Xcode.DERIVED_DATA_PATH) try: xcodebuild.test( test_sdk, simulators, enable_code_coverage=not disable_code_coverage, only_testing=test_only, xcargs=test_xcargs, custom_flags=test_flags, max_concurrent_devices=max_concurrent_devices, max_concurrent_simulators=max_concurrent_simulators, ) except IOError: testing_failed = True self.echo(Colors.RED('\nTest run failed\n')) else: testing_failed = False self.echo(Colors.GREEN('\nTest run completed successfully\n')) xcresult_collector.gather_results(Xcode.DERIVED_DATA_PATH) output_dir.mkdir(parents=True, exist_ok=True) self._copy_simulator_logs(simulators, output_dir) if not xcresult_collector.get_collected_results(): raise XcodeProjectException('Did not find any test results') test_suites, xcresult = self._get_test_suites( xcresult_collector, show_found_result=True, save_xcresult_dir=output_dir) message = ( f'Executed {test_suites.tests} tests with ' f'{test_suites.failures} failures and ' f'{test_suites.errors} errors in ' f'{test_suites.time:.2f} seconds.\n' ) self.echo(Colors.BLUE(message)) TestSuitePrinter(self.echo).print_test_suites(test_suites) self._save_test_suite(xcresult, test_suites, output_dir, output_extension) if not graceful_exit: has_failing_tests = test_suites and (test_suites.failures or test_suites.errors) if testing_failed or has_failing_tests: raise XcodeProjectException('Tests failed')
def collector(): return XcResultCollector()