def test_match(self): for test, task in [('test', 'task'), ('Test', 'Task'), ('TEST', 'TASK'), ('tESt', 'tASk')]: inp = '{%s}' % test assert_equal(test_or_task(inp, rpa=False), test) assert_equal(test_or_task(inp, rpa=True), task)
def _create_skip_message(self, test, new): msg = test_or_task( '*HTML* {Test} has been re-executed and results merged. ' 'Latter result had %s status and was ignored. Message:\n%s' % (self._status_text('SKIP'), self._html(new.message))) if not test.message: return msg return '%s<hr>Original message:\n%s' % (msg, self._html(test.message))
def test_failed(self, failure): if self._skip_on_failure: msg = ("%s skipped with --SkipOnFailure, original error:\n%s" % (test_or_task('{Test}', self._rpa) ,unic(failure))) self.failure.test = msg self.skipped = True else: self.failure.test = unic(failure) self.exit.failure_occurred(failure)
def _create_merge_message(self, new, old): header = test_or_task( '*HTML* <span class="merge">' '{Test} has been re-executed and results merged.' '</span>', self.rpa) return ''.join([ header, '<hr>', self._format_status_and_message('New', new), '<hr>', self._format_old_status_and_message(old, header) ])
def test_failed(self, failure): if hasattr(failure, 'skip') and failure.skip: self.test_skipped(failure) elif self._skip_on_failure: msg = ( "%s failed but its tags matched '--SkipOnFailure' and it was " "marked skipped.\n\nOriginal failure:\n%s" % (test_or_task('{Test}', self._rpa), unic(failure))) self.failure.test = msg self.skipped = True else: self.failure.test = unic(failure) self.exit.failure_occurred(failure)
def _skip_on_failure_message(self, failure): return test_or_task( "{Test} failed but its tags matched '--SkipOnFailure' and it was marked " "skipped.\n\nOriginal failure:\n%s" % unic(failure), rpa=self._rpa)
def visit_test(self, test): if test.name in self._executed_tests: self._output.warn("Multiple test cases with name '%s' executed in " "test suite '%s'." % (test.name, self._suite.longname)) self._executed_tests[test.name] = True result = self._suite.tests.create( name=self._resolve_setting(test.name), doc=self._resolve_setting(test.doc), tags=self._resolve_setting(test.tags), starttime=get_timestamp(), timeout=self._get_timeout(test)) self._context.start_test(result) self._output.start_test(ModelCombiner(test, result)) status = TestStatus(self._suite_status, result, self._settings.skip_on_failure, self._settings.critical_tags, self._settings.rpa) if status.exit: self._add_exit_combine() result.tags.add('robot:exit') if self._skipped_tags.match(test.tags): status.test_skipped( test_or_task( "{Test} skipped with '--skip' command line option.", self._settings.rpa)) if not status.failed and not test.name: status.test_failed( test_or_task('{Test} case name cannot be empty.', self._settings.rpa)) if not status.failed and not test.body: status.test_failed( test_or_task('{Test} case contains no keywords.', self._settings.rpa)) self._run_setup(test.setup, status, result) try: if not status.failed: BodyRunner(self._context, templated=bool(test.template)).run(test.body) else: if status.skipped: status.test_skipped(status.message) else: status.test_failed(status.message) except PassExecution as exception: err = exception.earlier_failures if err: status.test_failed(err) else: result.message = exception.message except ExecutionStatus as err: status.test_failed(err) result.status = status.status result.message = status.message or result.message if status.teardown_allowed: with self._context.test_teardown(result): failure = self._run_teardown(test.teardown, status, result) if failure: status.failure_occurred() if not status.failed and result.timeout and result.timeout.timed_out(): status.test_failed(result.timeout.get_message()) result.message = status.message if status.skip_if_needed(): result.message = status.message or result.message result.status = status.status result.endtime = get_timestamp() self._output.end_test(ModelCombiner(test, result)) self._context.end_test(result)
def _skip_on_failure_message(self, failure): return ("%s failed but its tags matched '--SkipOnFailure' and it was " "marked skipped.\n\nOriginal failure:\n%s" % (test_or_task('{Test}', self._rpa), unic(failure)))
def _skip_on_fail_msg(self, msg): return test_or_task( "{Test} failed but its tags matched '--SkipOnFailure' and it was marked " "skipped.\n\nOriginal failure:\n%s" % msg, rpa=self._rpa)
def test_no_match(self): for inp in ['', 'No match', 'No {match}', '{No} {task} {match}']: assert_equal(test_or_task(inp), inp) assert_equal(test_or_task(inp, rpa=True), inp)
def test_multiple_matches(self): assert_equal(test_or_task('Contains {test}, {TEST} and {TesT}', False), 'Contains test, TEST and TesT') assert_equal(test_or_task('Contains {test}, {TEST} and {TesT}', True), 'Contains task, TASK and TasK')
def _skip_on_fail_msg(self, msg): return test_or_task( "{Test} failed but skip-on-failure mode was active and it was marked " "skipped.\n\nOriginal failure:\n%s" % msg, rpa=self._rpa )
def visit_test(self, test): settings = self._settings if test.tags.robot('exclude'): return if test.name in self._executed[-1]: self._output.warn( test_or_task( f"Multiple {{test}}s with name '{test.name}' executed in " f"suite '{test.parent.longname}'.", settings.rpa)) self._executed[-1][test.name] = True result = self._suite.tests.create(self._resolve_setting(test.name), self._resolve_setting(test.doc), self._resolve_setting(test.tags), self._get_timeout(test), test.lineno, starttime=get_timestamp()) self._context.start_test(result) self._output.start_test(ModelCombiner(test, result)) status = TestStatus(self._suite_status, result, settings.skip_on_failure, settings.rpa) if status.exit: self._add_exit_combine() result.tags.add('robot:exit') if status.passed: if not test.name: status.test_failed( test_or_task('{Test} name cannot be empty.', settings.rpa)) elif not test.body: status.test_failed( test_or_task('{Test} contains no keywords.', settings.rpa)) elif test.tags.robot('skip'): status.test_skipped( test_or_task("{Test} skipped using 'robot:skip' tag.", settings.rpa)) elif self._skipped_tags.match(test.tags): status.test_skipped( test_or_task( "{Test} skipped using '--skip' command line option.", settings.rpa)) self._run_setup(test.setup, status, result) if status.passed: try: BodyRunner(self._context, templated=bool(test.template)).run(test.body) except PassExecution as exception: err = exception.earlier_failures if err: status.test_failed(error=err) else: result.message = exception.message except ExecutionStatus as err: status.test_failed(error=err) elif status.skipped: status.test_skipped(status.message) else: status.test_failed(status.message) result.status = status.status result.message = status.message or result.message with self._context.test_teardown(result): self._run_teardown(test.teardown, status, result) if status.passed and result.timeout and result.timeout.timed_out(): status.test_failed(result.timeout.get_message()) result.message = status.message if status.skip_on_failure_after_tag_changes: result.message = status.message or result.message result.status = status.status result.endtime = get_timestamp() failed_before_listeners = result.failed self._output.end_test(ModelCombiner(test, result)) if result.failed and not failed_before_listeners: status.failure_occurred() self._context.end_test(result)
def _create_add_message(self, item, suite=False): item_type = 'Suite' if suite else test_or_task('{Test}', self.rpa) prefix = '*HTML* %s added from merged output.' % item_type if not item.message: return prefix return ''.join([prefix, '<hr>', self._html_escape(item.message)])
def __init__(self, rpa=False): #: Instance of :class:`~robot.model.stats.TotalStat` for all the tests. self._stat = TotalStat(test_or_task('All {Test}s', rpa)) self._rpa = rpa