Exemple #1
0
    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)
Exemple #6
0
 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)
Exemple #7
0
 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)
Exemple #8
0
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)
Exemple #9
0
    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)
Exemple #10
0
 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)
Exemple #11
0
    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)
Exemple #12
0
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)]
Exemple #13
0
 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)
Exemple #14
0
 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))
Exemple #16
0
 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))