def pytest_runtest_protocol(self, item, nextitem): uuid = self._cache.set(item.nodeid) for fixturedef in _test_fixtures(item): group_uuid = self._cache.get(fixturedef) if not group_uuid: group_uuid = self._cache.set(fixturedef) group = TestResultContainer(uuid=group_uuid) self.allure_logger.start_group(group_uuid, group) self.allure_logger.update_group(group_uuid, children=uuid) test_case = TestResult(name=item.name, uuid=uuid) self.allure_logger.schedule_test(uuid, test_case) yield test_case.labels += [ Label(name, value) for name, value in allure_labels(item) ] test_case.links += [ Link(link_type, url, name) for link_type, url, name in allure_links(item) ] test_case.labels += [ Label(LabelType.TAG, value) for value in pytest_markers(item) ] test_case.fullName = allure_full_name(item.nodeid) test_case.historyId = md5(test_case.fullName) test_case.labels.append(Label('package', allure_package(item.nodeid))) uuid = self._cache.pop(item.nodeid) self.allure_logger.close_test(uuid)
def add_link(self, url, link_type, name): test_result = self.allure_logger.get_test(None) if test_result: pattern = dict(self.config.option.allure_link_pattern).get( link_type, u'{}') url = pattern.format(url) test_result.links.append(Link(link_type, url, name))
def stop_current_test(self, name, attributes): uuid = self.stack.pop() test = self.reporter.get_test(uuid) test.status = utils.get_allure_status(attributes.get('status')) test.labels.extend(utils.get_allure_suites(attributes.get('longname'))) test.labels.extend(allure_tags(attributes)) for label_type in (LabelType.EPIC, LabelType.FEATURE, LabelType.STORY): test.labels.extend(allure_labels(attributes, label_type)) for link_type in (LinkType.ISSUE, LinkType.TEST_CASE, LinkType.LINK): test.links.extend(allure_links(attributes, link_type)) test.labels.append(Label(name=LabelType.THREAD, value=self.pool_id)) test.labels.append(Label(name=LabelType.HOST, value=host_tag())) test.labels.append( Label(name=LabelType.FRAMEWORK, value='robotframework')) test.labels.append( Label(name=LabelType.LANGUAGE, value=platform_label())) test.statusDetails = StatusDetails(message=attributes.get('message'), trace=self.get_traceback_message()) test.description = attributes.get('doc') last_link = list(self.links.values())[-1] if self.links else None if attributes.get(Severity.CRITICAL, 'no') == 'yes': test.labels.append( Label(name=LabelType.SEVERITY, value=Severity.CRITICAL)) if last_link: test.links.append(Link(LinkType.LINK, last_link, 'Link')) test.stop = now() self.reporter.close_test(uuid)
def pytest_runtest_teardown(self, item): yield uuid = self._cache.get(item.nodeid) test_result = self.allure_logger.get_test(uuid) test_result.labels.extend([ Label(name=name, value=value) for name, value in allure_labels(item) ]) test_result.labels.extend([ Label(name=LabelType.TAG, value=value) for value in pytest_markers(item) ]) test_result.labels.extend([ Label(name=LabelType.TAG, value=value) for value in pytest_markers(item) ]) test_result.labels.extend([ Label(name=name, value=value) for name, value in allure_suite_labels(item) ]) test_result.labels.append(Label(name=LabelType.HOST, value=self._host)) test_result.labels.append( Label(name=LabelType.THREAD, value=self._thread)) test_result.labels.append( Label(name=LabelType.FRAMEWORK, value='pytest')) test_result.labels.append( Label(name=LabelType.LANGUAGE, value=platform_label())) test_result.labels.append( Label(name='package', value=allure_package(item))) test_result.links.extend([ Link(link_type, url, name) for link_type, url, name in allure_links(item) ])
def pytest_bdd_before_scenario(self, request, feature, scenario): uuid = get_uuid(request.node.nodeid) full_name = get_full_name(feature, scenario) name = get_name(request.node, scenario) with self.lifecycle.schedule_test_case(uuid=uuid) as test_result: test_result.fullName = full_name test_result.name = name test_result.start = now() test_result.labels.extend([ Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node) ]) test_result.labels.append( Label(name=LabelType.HOST, value=self.host)) test_result.labels.append( Label(name=LabelType.THREAD, value=self.thread)) test_result.labels.append( Label(name=LabelType.FRAMEWORK, value="pytest-bdd")) test_result.labels.append( Label(name=LabelType.LANGUAGE, value=platform_label())) test_result.labels.append( Label(name=LabelType.FEATURE, value=feature.name)) test_result.links.extend([ Link(link_type, url, name) for link_type, url, name in allure_links(request.node) ]) test_result.parameters = get_params(request.node) finalizer = partial(self._scenario_finalizer, scenario) request.node.addfinalizer(finalizer)
def _record_tool_link(self, test_result, tool_id): if tool_id and 'repos' in tool_id: tool_parts = tool_id.split("/") if len(tool_parts) >= 4: link = Link(LinkType.LINK, "https://%s" % "/".join(tool_parts[0:4]), "Tool Repository") test_result.links.append(link)
def add_link(self, url, link_type, name): test_result = self.allure_logger.get_test(None) if test_result: pattern = dict(self.config.option.allure_link_pattern).get(link_type, u'{}') link_url = pattern.format(url) new_link = Link(link_type, link_url, link_url if name is None else name) for link in test_result.links: if link.url == new_link.url: return test_result.links.append(new_link)
def parse_tag(tag, issue_pattern=None, link_pattern=None): """ >>> parse_tag("blocker") Label(name='severity', value='blocker') >>> parse_tag("allure.issue:http://example.com/BUG-42") Link(type='issue', url='http://example.com/BUG-42', name='http://example.com/BUG-42') >>> parse_tag("allure.link.home:http://qameta.io") Link(type='link', url='http://qameta.io', name='home') >>> parse_tag("allure.suite:mapping") Label(name='suite', value='mapping') >>> parse_tag("allure.suite:mapping") Label(name='suite', value='mapping') >>> parse_tag("allure.label.owner:me") Label(name='owner', value='me') >>> parse_tag("foo.label:1") Label(name='tag', value='foo.label:1') >>> parse_tag("allure.foo:1") Label(name='tag', value='allure.foo:1') """ sep = allure_tag_sep(tag) schema, value = islice(chain(tag.split(sep, 1), [None]), 2) prefix, kind, name = islice(chain(schema.split('.'), [None], [None]), 3) if tag in [severity for severity in Severity]: return Label(name=LabelType.SEVERITY, value=tag) if prefix == TAG_PREFIX and value is not None: if __is(kind, LinkType): if issue_pattern and kind == "issue" and not value.startswith( "http"): value = issue_pattern.format(value) if link_pattern and kind == "link" and not value.startswith( "http"): value = link_pattern.format(value) return Link(type=kind, name=name or value, url=value) if __is(kind, LabelType): return Label(name=kind, value=value) if kind == "id": return Label(name=LabelType.ID, value=value) if kind == "label" and name is not None: return Label(name=name, value=value) return Label(name=LabelType.TAG, value=tag)
def pytest_runtest_protocol(self, item, nextitem): uuid = self._cache.set(item.nodeid) for fixturedef in _test_fixtures(item): group_uuid = self._cache.get(fixturedef) if not group_uuid: group_uuid = self._cache.set(fixturedef) group = TestResultContainer(uuid=group_uuid) self.allure_logger.start_group(group_uuid, group) self.allure_logger.update_group(group_uuid, children=uuid) test_case = TestResult(name=allure_name(item), uuid=uuid) self.allure_logger.schedule_test(uuid, test_case) if hasattr(item, 'function'): test_case.description = item.function.__doc__ yield for name, value in item.callspec.params.items() if hasattr( item, 'callspec') else (): test_result = self.allure_logger.get_test(uuid) if test_result: test_result.parameters.append(Parameter( name, represent(value))) test_case.labels.extend([ Label(name=name, value=value) for name, value in allure_labels(item) ]) test_case.labels.extend([ Label(name=LabelType.TAG, value=value) for value in pytest_markers(item) ]) test_case.labels.append(Label(name=LabelType.HOST, value=self._host)) test_case.labels.append( Label(name=LabelType.THREAD, value=self._thread)) test_case.labels.append(Label(name=LabelType.FRAMEWORK, value='pytest')) test_case.labels.append( Label(name=LabelType.LANGUAGE, value=platform_label())) test_case.links += [ Link(link_type, url, name) for link_type, url, name in allure_links(item) ] test_case.fullName = allure_full_name(item) test_case.historyId = md5(test_case.fullName) test_case.labels.append(Label('package', allure_package(item))) uuid = self._cache.pop(item.nodeid) self.allure_logger.close_test(uuid)
def stop_current_test(self, name, attributes): uuid = self.stack.pop() test = self.reporter.get_test(uuid) test.status = utils.get_allure_status(attributes.get('status')) test.labels.extend(utils.get_allure_suites(attributes.get('longname'))) test.labels.extend(utils.get_allure_tags(attributes.get('tags'))) test.labels.append(utils.get_allure_thread(self.pool_id)) test.labels.append(Label(LabelType.HOST, value=host_tag())) test.statusDetails = StatusDetails(message=attributes.get('message')) test.description = attributes.get('doc') last_link = list(self.links.values())[-1] if self.links else None if last_link: test.links.append(Link(LinkType.LINK, last_link, 'Link')) test.stop = now() self.reporter.close_test(uuid)
def add_link(self, url, link_type, name): test_result = self.logger.get_test(None) if test_result: pattern = u'{}' if link_type == LinkType.ISSUE and self.issue_pattern: pattern = self.issue_pattern elif link_type == LinkType.LINK and self.link_pattern: pattern = self.link_pattern link_url = pattern.format(url) new_link = Link(link_type, link_url, link_url if name is None else name) for link in test_result.links: if link.url == new_link.url: return test_result.links.append(new_link)
def allure_links(attributes, prefix): tags = attributes.get('tags', ()) def is_link(link): return link.startswith("{link}:".format(link=prefix)) def parse_link(link): lnk_val = link.split(':', 1)[1] or 'unknown' lnk_label = search(r'\[.+\]', lnk_val) if lnk_label: lnk_label = lnk_label.group(0) lnk_val = lnk_val.strip(lnk_label) lnk_label = lnk_label.strip('[]') else: lnk_label = lnk_val return {'name': lnk_label, 'value': lnk_val} return [Link(type=prefix, url=parse_link(tag).get('value'), name=parse_link(tag).get('name')) for tag in tags if is_link(tag)]
def stop_current_test(self, name, attributes): uuid = self.stack.pop() test = self.reporter.get_test(uuid) test.status = utils.get_allure_status(attributes.get('status')) test.labels.extend(utils.get_allure_suites(attributes.get('longname'))) test.labels.extend(utils.get_allure_tags(attributes.get('tags'))) test.labels.append(utils.get_allure_thread(self.pool_id)) test.labels.append(Label(LabelType.HOST, value=host_tag())) test.labels.append( Label(name=LabelType.FRAMEWORK, value='robotframework')) test.labels.append( Label(name=LabelType.LANGUAGE, value=platform_label())) test.statusDetails = StatusDetails(message=attributes.get('message')) test.description = attributes.get('doc') last_link = list(self.links.values())[-1] if self.links else None if attributes.get(Severity.CRITICAL, 'no') == 'yes': test.labels.append( Label(name=LabelType.SEVERITY, value=Severity.CRITICAL)) if last_link: test.links.append(Link(LinkType.LINK, last_link, 'Link')) test.stop = now() self.reporter.close_test(uuid)
def add_link(self, url, link_type, name): self.allure_logger.update_test(None, links=[Link(link_type, url, name)])
def add_link(self, url, link_type, name): with self.lifecycle.update_test_case() as case: link = Link(url=url, type=link_type, name=name) if case and link not in case.links: case.links.append(Link(url=url, type=link_type, name=name))
def add_link(self, url, link_type, name): test_result = self.allure_logger.get_test(None) if test_result: test_result.links.append(Link(link_type, url, name))